ReplicatedFirst is primarily used for when the client is starting to load in, but it hasn't loaded completely. This allows you to use things such as custom loading screens, etc.
ReplicatedStorage is something that both the Client and the Server can "see". All items parented to ReplicatedStorage are, as you can guess, replicated, which means that the Client and Server knows its children "exist" in a way.
ServerStorage is something only the Server can see. Trying to access a child of ServerStorage on a local script will come up nil because the server never sent the data to the client about the child because it wasn't replicated. This is great for things you don't trust the client with or don't want the client to handle performance wise because the data won't be replicated to them.
I hope this sums it up a bit for you, if you need anything more feel free to comment and I'll try and respond.
1 comment
http://wiki.roblox.com/index.php?title=API:Class/ReplicatedStorage http://wiki.roblox.com/index.php?title=API:Class/ReplicatedFirst http://wiki.roblox.com/index.php?title=API:Class/ServerStorage read about them here. It explains what they are used for.