Of course they were written in assembly, why wouldn't they be?
Take the ZX Spectrum as a good example: people were making new games all the time in their bedrooms, and if you browse old Speccy magazines, you'll see countless adverts for them, most of which say "fully written in machine code" as a selling point - since the only alternative was BASIC, which is very slow and primitive.
Perhaps parts were done in another language. My dad was telling me about his programming days (not games but business software) and said they usually didn't write directly in assembly, instead using C or something like that, but they still had to get into the assembly to tweak it. After all, 8-bit computers and consoles are primitive by today's standards, and you need to get every instruction working right for two reasons: speed and storage capacity.
Look at the NES: without memory management controllers (which didn't appear until around 3 years after the Famicom debuted) you get 8KB for graphics and 32KB for everything else. If you're writing the whole thing in a high level language, it may be doing instructions that are totally redundant and wasting space in your valuable storage. Not only that, but these instructions take time. If you want a fast-moving action game, you really need to fine tune the code.
Also, having worked on a good few NES games myself for hacking purposes, I can say that although you may think games look similar, under the hood it's a different story. Sure, if you take, say, Mahjong and Gomoku Narabe Renju, which immediately look very similar because they were clearly made at the same time by the same team, you can see similarities. But SMB3 and Mega Man 2? I doubt that they look similar in the code. There's a reason people talk about 'game engines': you spend time crafting an engine and then you can make several games with it, rather than reinventing the wheel every time, like you said (hey, they made six Mega Man games on the NES: that's a great example of having a good engine and just rehashing it to death).
But having delved into 6502 assembly, I don't see it as impossible to code a game that way: it's a really simple language. I could never get started on high level languages, while 6502 assembly now seems very accessible to me. It doesn't take 100 hours to compress graphics: that's what computers are for!
As FAST6191 says, assembly is a bit easier to work with than pure bytes because you can use definitions of things that you need, usually addresses. So instead of making a branch instruction and having to literally count the bytes until the next instruction (which will change if you change your code) you just write to branch to the PlayerShootingHisWeapon routine or whatever and the compiler takes care of it. In fact, take a browse through the reverse-engineered SMB disassembly to see what I mean.https://gist.github.com/1wErt3r/4048722