I think there was a big "missing middle".
You were all but guaranteed a BASIC in most late 70s/early 80s home computers. It was frequently optimized for development cost and ROM size-- so "it fits into 4k or 8k" was more important than performance or quality of life features. The canonical example of this problem was Commodore's 2.0 BASIC-- incapable of accessing almost all of the machine's graphics and sound capacities without resorting to peeks and pokes. Even if you could fight through that, it wasn't going to be possible to maintain smooth animations or do cycle-precise operations.
The other available option was assembly. Most platforms had some assembler/monitor package available for fairly cheap, or even built into ROM.
The solutuons you'd expect to fill the gaps simply weren't there. You didn't see too many compiled languages (which could close the performance gap) likely because compilers of the time were typically expensive and commercial, and often required fairly big hardware (disc drives and more memory) to run on. If you had a VIC-20 or ZX80, there was barely room for any nontrivial code, let alone a compiler to toss around intermediary state.