They don’t all need an AudioSource. 
1. You could call AudioSource.PlayClipAtPoint(audioClip, position, volume), which is a static method that temporarily creates an object for the sound at a certain position (and then deletes it when the sound completes). This way you don’t need any AudioSource at all, and you can still play more than one sound at a time (I don’t know if that is important for you). If your sounds play very frequently you might want to avoid creating lots of objects, though, but depending on the performance required it might not make a difference. Also, a small disadvantage: you can’t get a reference to the dynamically created sound, so there’s no pausing or stopping the sound.
2. You could also create a single object in the scene that contains the sound references (the array of AudioClips) and is called by the objects when they need to play a sound. It’s a kind of “sound manager”, like you mentioned, but for this purpose only. This avoids wasting memory with arrays of sound references in each object (see “bonus answer” below). You can still use AudioSource.PlayOneShot in the manager if you require many sounds at once (same disadvantages as above), or add an AudioSource component to the manager.
As to how you’ll get the reference to this manager from each object (seeing as they are prefabs that get instantiated), you have many ways. The script that creates your objects from the prefab might store in them (actually, in a script they have) the reference to the manager. One of the best ways I know is to use events and a global events class (see this example), and each object throws an event when it wants to play a sound, which the manager acts on. This doesn’t even require a reference to the manager. I’m avoiding “Find” solutions on purpose, as they are error-prone and rather slow.
3. Yet another way is to store your sounds in the Resources folder and then call Resources.Load< AudioClip >(“relative path to audio clip inside Resources”) when a sound is needed. This would require no references to sounds, but would require usable names for them. This way, you could keep your objects (with no arrays), and then load the sound and use PlayOneShot (no manager is needed). It also only loads sound files as needed. The overhead of calling Resources.Load to load a sound always seemed negligible in my use cases, but that depends on the scenario, of course.
All of these solutions sound reasonable to me.
I have no strict preference, as it depends on the exact situation. Bottom line is: you should avoid having an array of references in every object if they are all the “same”. Also avoid an AudioSource per object if many are created (I think 50 already qualifies :)).
Bonus answer: the audio clips themselves (audio waves) are referenced from your project, so you’ll only have 10 sounds wasting memory, even if you have 50 objects. However, each of your instantiated objects will contain an array of 10 references, so that totals 500 references and, in that case, you might want a better solution. 
(This doesn’t exactly answer your bonus question, though. I wish I could tell you if the AudioClips in the arrays are simple references to the sound files in the project or are some kind of wrapper that occupies further memory. In the first case, all your objects will have an array of references, and that’s it. 500 references and 10 sounds. In the second case, an object of type AudioClip has to be created for each sound reference, so 500 sound references, 500 AudioClips and 10 sounds. I’m not sure which one it is.)