Hey Robert,
this is likely caused by the fact that the underlying FName class used for names does store an index into a table and is case-insensitive at runtime.
More specifically, it will store the first instance of a string that gets registered case-sensitive. Once other FNames are created for the same string (but with possibly different casing) they will all use the same index/table entry and thus get the same casing applied that the first thing that used that name had.
So for your two engine builds it is likely the order in which these components and anything else using the FName “position” are created that defines the outcome.
You could try to force a specific casing by initializing an FName with the desired casing early on at startup, but in general the casing should be deterministic across different builds.
Hopefully that clears up the mystery a bit.
There is a define in the Engine in NameTypes.h called WITH_CASE_PRESERVING_NAME that controls this behavior. It is enabled for Editor builds but disabled in game builds.
If you have issues with a lot of names and really need the case preserved you could try enabling this define, but it will increase the memory used for FNames, since they will have to store all individual variations of a string in that case (no pun intended :D).
Best,
Sebastian