Because HTTP was designed as a way to retrieve documents, i.e. pages of text. Only later this was enriched with images, scripts and other external resources.
Not every request for a document needs all related resources, for example (text-only) crawlers or browsers who have all related resources cached already - they just want to retrieve the document itself.
As for inlining the external resources, yes, that can be done using <script>
and <style>
elements, and using inline image data, see How to display Base64 images in HTML?.
Using HTTP/2 a compatible browser/server pair one can also utilize server push, doing exactly what you expect the older HTTP versions to support. See HTTP 2 will support server push, what does this mean?.
Also, as technology evolves, things can get added to a protocol - if that protocol is open to backwards-compatible changes. This one can't be easily hacked into HTTP/1.1 in a way that would keep older browsers and servers working.