>メッセージキューがスレッドを区別してるわけですか。

まぁ、そうとも言えますが、OSがウィンドウにメッセージをポストするとき
そのウィンドウをつくったスレッドのキューに入れる、ってことですね。

>既にメッセージキューを持っているスレッドなら、新しいウィンドウのイベントもそのキューを使うわけですね。

そうです。動的に TForm2 のインスタンスをつくっても動くのはそのためです。

>で、新しいメッセージのディスパッチルーティンを実行してくれるわけですか。

いえ、ひとつのメッセージキューには、最低ひとつのメッセージループがあれば
よいのです。これは、Delphi の GUI アプリの場合は Application.Run の
中にあります。

>OSはキューにイベントを入れた後、コールバックでディスパッチルーティンを非同期で呼び出す必要があるわけですが

いや、キューにポストして、たんにそのスレッドにタイムスライスを与えてメッセージループ
を回すだけです。メッセージループが、キューからメッセージを取り出して、DispathMessage()
でコールバック関数(ウィンドウ関数)を呼び出します。ですから、GUI アプリの
メインルーチンは、メッセージループだけであり、キューを経由するメッセージはもちろん
SendMessage() で送られたメッセージもすべて、メッセージループのなかの PeekMessage()
または GetMessage() が実行されるタイミングで、メッセージ処理ハンドラが呼び出している
と解釈しても間違いではありません。ハンドラを直接・間接に呼び出しているわけですから、
各ハンドラの処理が終わると、また、メッセージループに制御が戻り、それがまわって
次のメッセージ処理を行なうわけです。