Du musst dir bewusst machen, was bei SetLength alles geschehen kann.
Nehmen wir an, du hast ein Array mit 100 Elementen. Es liegt als Datenstruktur im Heap. Wenn du es nun auf tausend Elemente vergrößern willst, wird, wenn du Glück hast, noch Speicher nach dem alten Array frei sein, der dann dem Array hinzugefügt wird. Wenn kein Speicher frei ist, muss das Array verschoben werden. Und genau dann ist deine Annahme verletzt.
Zitat:
Auf alle anderen Elemente von x müsste man problemlos zugreifen können, da die nicht mehr verändert werden.
Wenn du Pech hast, holt sich der Lese-Thread nämlich den alten Arrayzeiger, und bevor er ihn dereferenzieren kann, wird das Array von einem schreibenden Thread verschoben. Wenn du Glück hast, raucht dir der Lese-Thread mit einer Zugriffsverletzung ab - andernfalls kannst du dir leicht den Heap zerschießen.