This has to do with how Unity’s set up. Unity is a c++ engine, with C# user scripts running on top of it. Everything that the engine knows about exists on the c++ side, and have C# wrappers that you work with. So things like Transforms, GameObjects, Materials, Textures, etc. all live in c++. Objects that you create at runtime - like strings, or custom classes - only exists in C#-land.
The rule-of-thumb is that if the type inherits from UnityEngine.Object, it lives in C++, and you’re handling a representation of it in your C# scripts.
How this ties into your question, is that Textures are not objects that can be GC’d, as they exist in the unmanaged memory of the c++ engine. The C# Texture type will (probably) get GC’d if you let go of all references to it, but that object’s just a link to the c++ Texture (and that’s the object you see in the profiler!). So you have to explicitly tell the engine to free it, either by destroying it directly (Object.Destroy), or by asking it to free all objects not referenced by C# scripts, which is done through Resources.UnloadAllUnusedAssets. That’s a bad method name, because since it’s a Resources-method, it seems like it’d only have to do with assets handled by the Resources system.
Note that for most of the engine objects, you don’t have to worry about this, as they’re removed either when you destroy them - usually though unloading the scene. But, objects that can be used across scenes (“Resources” in your reply from QA) won’t be handled in that way.
I don’t know all the details, but I’m guessing that the reason why Unity frees textures that’s stored to disk automatically is that they can just re-create them if you need them. Textures that you create manually are more tricky, so it’s probably not possible for Unity to clean them up automatically.
Finally, You can save yourself a lot of headache by just calling Resources.UnloadAllUnusedAssets whenever you’ve got a loading screen up anyways. It might be sufficient to not have to deal with this issue directly.