Mal abgesehen davon, dass die Nachrichtenschleife in deinem Beispiel keinen Sinn macht, hast du vergessen, auf WM_QUIT zu reagieren:
Delphi-Quellcode:
while GetMessage(Msg, 0, 0, 0) do
begin
if Msg.Message = WM_QUIT then break;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;