TThreadList ist thread-save, drum heißt die auch so.
alles Andere musst immer DU absichern.
CriticalSection, System.TMonitor oder sonstwie
Auch eine TThreadList musst du explizit absichern, nämlich mit LockList, welche intern ein TMonitor.Enter ausführt, und sie wieder unlocken mit UnlockList.
Das sollte bei der Veränderung in einer parallel for eine ziemlich bescheidene Performance bewirken.
Ich glaube auch, dass du mittels for in durch ein Dictionary iterieren können solltest...
Ist unnötig für den geforderten Usecase - ein Iterator für ein Dictionary gibt die Key/Value Pairs, hier sind aber nur die Keys vonnöten - daher .Keys iterieren, wie ich oben schrieb.