Both my example and Rama’s that you linked earlier use hard UAsset pointers. This means for instance that loading a UDataAsset with an array of UTexture2D* will in turn load all these textures, unnecessarily keeping things in memory that might not be needed. Your wording (“only is created once”) strongly hints that this “load everything” behaviour is what you intended.
FStringAssetReference and TAssetPtr, on the other hand, do not automatically load the associated asset. The asset reference will “be available for the entire game session”, yes, but the asset itself will not be loaded automatically, avoiding potentially unneeded memory usage. So keeping a data asset containing only these is fine as it won’t waste memory. But loading these assets on demand, as I mentioned in my previous post, is more complicated so I didn’t want to introduce that in my example.
Basically just trying to limit myself to the scope of OP’s question (managing references, not loading them).