1) Load the sound at the start of the level. (The same goes for textures, models, etc)
2) Free them at the end of the level
If sounds and models etc are the same across all levels then you can load them when the game starts instead (and free them when the game ends), you could also store a list of resources required for each level and then load the full list for level 1, at the end of level 1 you check the difference in the resource list for lvl 1 and 2 and free the resources that are no longer needed and then add any new additions.
All bullets can share 1 sound object so you don't need to load it once for each bullet.
The problem is how can I play them from the Bullet class if I do that.
keep a pointer to the sound in the bullet class, pass the sound by reference to the bullet constructor.
Or have a AudioPlayer class that all bullets have a pointer to and simply do something like
the AudioPlayer then stores a map of identifiers (i used a string id in that example) and sounds. (This is a bit cleaner if you need one object to play multiple different sounds) and just plays whichever one is requested. (You could also pass in the position then to get stereo or 3D sound)