The main difference is that if you have multiple subscribers to the same Observable from an HTTP request, that request is going to run several times. Each subscriber basically creates an instance of the request/response Observable stream when it subscribes.
That’s not the case with a subject. A subject will do its work and send it to all subscribers. As a result, it’s usually the best option because it’s truly multicast.