Use a shift register; there's nothing overkill with that (it's not "complexer" than a ring counter). You can drive it with another SPI peripheral of your microcontroller, or you can just bitbang it, since you will change that less often than you'll talk to your multiple peripherals. 2 additional pins.
Alternatively, I²C port expanders are a thing (2 pins), and I'd be surprised if you can't find a 1-wire-protocol device that does the same thing (which will be harder to use). A cheap microcontroller can be attached via UART to do the same (1 to 2 pins).
But honestly, if you're running out of GPIO for CS, it might be a good point to either switch to a microcontroller with more GPIO, or simply add a cheap second microcontroller which takes the complete SPI handling load from your main microcontroller and communicates with that e.g. via UART. A pretty original and comparatively cheap source for "microcontroller as IO expanders on speed" is using one of the ubiquitous Cortex-M chips that bring an SWD interface and just using that to manipulate the microcontroller as a "puppet" device. In PoC||GTFO 0x10, Micah Scott documented such SWD marionettes.