Just a minor detail: instead of a while loop you could use a for-loop, which is the preferred construction to iterate over an index, and is less sensitive for infinite loop 'accidents'.
About your question: I think it would be a nice feature to be able to refer to E-Basic variables inside list elements. However, the developers of E-Prime used a different approach for dynamically loading list content:
1) the []-syntax to reference the content of another attribute (i.e. [OtherAttrib])
2) nested lists
You can combine the two to pull values from another (nested) list. So, if you put the four filenames in a nested ColorList, you could use these values in the Train list. (Using the randomization settings of the ColorList when populating the Train list.) In this case you probably have to use the colon syntax to pull four values from the same nested attribute for a single Train trial ([OtherAttrib:0] [OtherAttrib:1] etc.). So, in your case you could place [OtherAttrib:0] in the Color1 attribute, [OtherAttrib:1] in the Color2 attribute, etc.
Also see the attached example.
Cheers
Paul