Assuming that the chip starts in a well-defined state upon reset, an alternative would be to use the 9928 rather than the 9918; the primary difference is that you get component outputs rather than composite. You also lose video in, so each would be running individually. But the option it brings is running three of them simultaneously and e.g. taking only Y from each to form the triplet of R, G, B.
It's not completely scientific, as these things often come from consensus wisdom of visual colour matching rather than from hardware analysis, but I grabbed an image of the TMS palette from the web, desaturated by converting to luminance value, and sampled the results. Sorted into order and divided into close tiers as per the unscientific nature of the experiment, I got potential Y outputs of:
205 204 199
So I make that probably ten usable levels of output per channel — the hypothetical machine would support 1,000 colours.
Have them sit at the same addresses, but add bus logic so that you can enable or disable any combination of them and you could even save time by pushing the same graphics to each, then diverging for a palette set.
As to your resistor network idea, that's approximately how the SAM Coupé's Kaleidoscope add-on works. One programmatically sets a multiplier of video levels, in 256 steps. It's a terrible implementation so in practise it's often hard to see the difference, but in principle one puts an ordinary image on screen, then runs a busy loop on the CPU to race the raster (or do it once per scan line, that being the resolution of interrupts), tweaking output levels in much the same way as you might dynamically swap palettes. A user without a Kaleidoscope just seems the normal image.
On the one hand, if you could automate that then it might be a workable solution. But on the other hand, if you are willing to create a circuit that can grab a value from memory and then transcribe it into an analogue level, you should probably just use a 6845 and implement the complete colour output yourself. With one of those you programmatically set timing, then it gives you current pixel address to output plus information about the correct placement of syncs. So all you need do is grab the value indicated and output, using whatever size of source data and mapping to colours you desire.