I use subsystems to extend functionality in an accessible way, so that I do not have to create gigantic code heavy subclasses of primary Unreal classes like GameMode and GameInstance.
You can also use custom UInterfaces with subsystem to create stub and test versions of complex classes, such as external APIs. You check if you’re building development vs shipping and instantiate your local development version of the subsystem instead, since all functions pass through your custom UInterface.
Something like an object pool that would be a good WorldSubsytem. You can get the subsystem anywhere you’d need it, C++ or Blueprint without hard references. As for Weak Pointers, etc, use Unreal’s version and you should be fine. Most of the work and checking should occur in your object pool factory function(s).