Ist dir nie aufgefallen, dass es mehrere Varianten der Methoden gibt?
Einmal normal und dann nochmal als class-procedure.
TThread.Synchronize
TThread.Synchronize(nil, ....);
Auch wenn es nie die "richtige" TThread-Instanz liefert, selbst wenn es ein Delphi-Thread wäre.
TThread.CurrentThread
TThread.CurrentThread.Synchronize(...);
Wobei das CurrentThread immer ein TExternalThread ist und dort nicht alles funktioniert, wie z.B. Terminate, da Terminate nur eine Variable setzt, was hier nichts bringt, weil es ja eine andere Instanz ist.
PS: GetCurrentThreadId vs. TThread.CurrentThread.ThreadId
(Letzteres für Multiplatform-Code, aber im Windows würde ich eher Ersteres verwenden)