Have you tried using MVDegrain to filter only the chroma? I find that at extremely high settings (thSAD=10000) while using plane=3, it can remove or reduce rainbowing that the other filters can't even touch. It also does a great job of removing other chromatic artifacts. Of course, at such high settings, you might only want to filter specific trouble spots. Side Effects are few - I've seen some desaturation on or around fast moving objects, and also desaturation on the first frame of a scene change. But for the most part it retains all of the natural color saturation. Not too bad considering the effect it has on the most troublesome of rainbowing.
EDIT: Here is my script, which is an altered version of the function MVDegrain2i2 that deals specifically with interlaced video. I simply call it MVDegrain2i2chroma.avsi
function MDegrain2i2chroma(clip source, int "overlap", int "dct")
{
overlap=default(overlap,0) # overlap value (0 to 4 for blksize=8)
dct=default(dct,0) # use dct=1 for clip with light flicker
fields=source.SeparateFields() # separate by fields
super = fields.MSuper()
backward_vec2 = super.MAnalyse(isb = true, delta = 2, overlap=overlap, dct=dct)
forward_vec2 = super.MAnalyse(isb = false, delta = 2, overlap=overlap, dct=dct)
backward_vec4 = super.MAnalyse(isb = true, delta = 4, overlap=overlap, dct=dct)
forward_vec4 = super.MAnalyse(isb = false, delta = 4, overlap=overlap, dct=dct)
fields.MDegrain2(super, backward_vec2,forward_vec2,backward_vec4,forward_vec4,thSAD=10000,plane=3)
Weave()
}
I hope this info may help in some way. I wish you guys the best of luck! It already looks wonderful