Lo primero, cuando crees un bucle para cerrar las ventanas deberías hacerlo en orden inverso, de lo contrario al ir cerrando las ventanas los índices cambiaran y puede darte problemas:
Código Delphi
[-]
for I :=MDIChildCount - 1 downto 0 do
Aunque se me ocurre otra solución, interrogar ventana a ventana si pueden cerrarse, y si alguna responde que no abortamos el proceso.
Código Delphi
[-]
procedure TMainform.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i : Integer;
begin
for I := 0 to MDIChildCount - 1 do
if not MDIChildren[i].CloseQuery then
begin
CanClose:= FALSE;
Exit;
end;
for I :=MDIChildCount - 1 downto 0 do
MDIChildren[i].Close;
end;