Mit Option freeonterminate=true
[...]
Wenn ich irgendwann später MThread.terminated abfrage, so ist dieser immer noch aktiv.
[...]
Mache ich allerdings beim FormClose die Zeile: if assigned(MThread) then freeandnil(MThread) rein, knallt es.
FreeOnTerminate bedeutet nicht, dass alle Variablen, die diesen Thread referenzieren, auf nil gesetzt werden.
Somit greift die Abfrage auf MThread.Terminated evtl. auf ein nicht mehr existierendes Objekt zu - Fehler!
Und im FormClose ist MThread auch dann noch Assigned, wenn der Thread selber freigegeben ist, gleiches Problem!
Vllt. solltest Du MThread im OnTerminated auf nil setzen, bzw. das Konzept weiter überdenken.