Are you sure about that? Most of the mid-2000's jQuery components bundled their HTML and CSS in bespoke template strings within JS. If you remember, jQuery's `.css()` method accepted JSON to set CSS properties, and `.html()` accepted a string to set the inner-HTML.
And if you needed to manipulate strings to generate HTML, you'd be doing so with some kind of template mechanism, like string concatenation or substring substitutions. John Resig, author of jQuery, wrote Secrets of the JavaScript Ninja in 2008 [1], offering a small templating engine that does exactly that. The first commit in the Underscore library credits this book for their `template` method [2].
I think your chronology is skewed or confused. "SPAs" have been brewing in some form since the mid-2000's, when people stopped writing plain old HTML and CSS. Everything was jQuery UI widgets and AJAX, Prototype and Underscore templates. HTML died a very long time ago.
[1]: https://blog.codinghorror.com/secrets-of-the-javascript-ninj...
[2]: https://github.com/jashkenas/underscore/commit/02ede85b539a8...