You create TStopWatch 22 times, but never free it. It is memory leak. Also i guess more interesting numbers come if StopWatch was used outside the "for I" loop. What kind of numbers do you get?

Also because of the caused function parameter load, compiler optimization might do things. Optimization might "inline" automatic if constants were used
Code:
procedure TWorldData.SetData(const X, Y, Z: Integer; const Position: T3Dposition); //inline; ?
Even the GetData allocates and sets 12 bytes for 3 integers for each pos, while nested for-loops do not.