DanielS: Functional abstraction, modularity, and such is absolutely possible in assembly language, even with just a light layer of macros to manage things. But, given that the context is the Commodore 64 and not some 14-100MHz newer variant, 1MHz is not a lot (~15k-18k cycles available per frame, visible using raster bars for profiling), and 64KB is not a lot when you start writing code in such a fashion. You hit walls very quickly after you get such a framework bootstrapped.
Hence, things trended to the shortest and fastest way in competitive development (commercial, demoscene, etc), which is to directly access known memory locations in a static layout, using only up to 1 level of indirection through static-location vectors, as the baseline development style. Venturing further than that comes at noticeable cost, but that tradeoff certainly can be appropriate for the higher-complexity end of things. Just don't start there, build up to it.
IMO, the best way to get into the mindset of the time is to read source code listings & dive into disassemblies. All the C64 ROMs sources/disassemblies are commented online in various forms, and you can see some of the static layout techniques in play.