Closing as "Won't Fix": there is actually an error in the "VFXManager.cs" script found in the reproduction project.
What is happening here is:
- In the player, a texture that is not enabled for Read/Write does not have CPU data (as one would expect). However: in the editor, textures actually really keep their CPU data around in the background even if they are not enabled for Read/Write.
- Graphics.CopyTexture performs a copy of the CPU data in the editor, since it is actually available.
- The "textureArray.Apply(true, true);" thus does not truly affect the end result, because the CPU data was filled out by the CopyTexture. As such, Unity uploads something that looks visually correct to the GPU. (though: note that the correct data was already on GPU after the CopyTexture)
- However, in the player, Graphics.CopyTexture performs no CPU data copy since it is not available. The "textureArray.Apply" succeeds but the texture ends uploading CPU data that hasn't actually been modified after initialisation (overriding the work that CopyTexture did!) -- hence the pure black look.
- Texture2DArrays cannot be created without CPU data in Unity today (an option could be RenderTextures, but only if the source Texture2Ds were uncompressed) -- one solution for this issue could be to simply move the "Apply" to before the Graphics.CopyTexture. This way, the GPU data ends up being correct & the texture does not keep its CPU data around either.