Suppose now I do end up with a Manager per type of asset and I am giving away raw pointers, why would I want shared_ptr instead of a unique one? I see why I'd need a shared one if I give away weak_ptr, but why with raw pointers?
What is a manager, exactly?
Let's take a ModelManager.
I'm guessing you've got one set of calls that says 'Load this model and give me a handle". This breaks down to several tasks. The model may already exist and be in use, so that means a model cache and/or a model pool. You have a handle to a model, but if you are sane you will not block. You want an immediate response that returns a proxy object rather than waiting a half second or maybe even longer for the data to get loaded from disk, so you've got a proxy. Then you are wanting the data from somewhere, probably a disk but also potentially from a data stream or potentially from a network or some other location.
So as I wrote earlier "manager" usually means "cache", "loader", "pool", and "proxy".
Also remember that you are dealing with data, your objects are wrappers around data. You don't care so much about the object at 0x32b34100, but you do care about the data "model of the player". That is a subtle but important distinction.
Using those we can answer your questions.
Is a ModelManager class (I'd prefer calling it a ModelPool) going to give away raw pointers to the data? In major projects, no way. You don't want to wait for loads (especially for complex models made up of many meshes and textures that potentially cause a cascade of loading many other resources), you want to allow reuse and restructuring of data, so you have a proxy object that serves for indirection to access data. The proxy can redirect to a placeholder. The proxy can redirect to loaded resource data. It is possible that the pool may be doing some shuffling internally and moving stuff around so there may be more than one copy of the data, you don't care where it is, only that you have a way to access valid data through an object. If the data needs to move for some reason the proxy can redirect it to a new copy or an old copy or whatever it wants. If the data gets evicted from the model cache for any reason the proxy can handle it correctly and give you CORRECT and USABLE data, even if that is not IDEAL data of the final model. Far better to get a single-point model for your proxy object that is available instantly rather than to stall the player for several seconds and pop up a loading screen.
is a ModelManager class (= ModelPool) going to give away shared_ptr or unique_ptr or similar? No, because the classes that rely on it do not manage the object's lifetime. The cache or pool is in charge of the actual model data's lifetime. If you are using a proxy then you don't care about the lifetime of the proxy, instead only caring about the lifetime of the texture. So you can return a proxy object directly, and you don't give out the details of the resource except within the library itself.
When the renderer needs the model and gives you a proxy to fill out, the proxy (not the manager) can return a raw pointer because the pointer will be immediately used and then discarded with an immediate single-use lifetime. That pointer may point to the actual model or to the default placeholder model, but that doesn't matter because it only exists for an instant and is not preserved anywhere. The only time such a pointer is handed out is for immediate use, never to be persisted nor stored by any system. The raw pointer should be considered invalidated very quickly depending on your system design. It may be invalid at the end of the function, it may be invalid at the end of the frame, it may be invalid at the end of the update, but whatever it is, the raw pointer should never be stored for longer term use.