If you had a reflective strip between each color—and just counted the strips to determine current color—wouldn't that have kept it in continuous calibration? Then you wouldn't even need a stepper motor, you could use a plain DC motor, since you wouldn't be using the step count to determine position anymore.
(I haven't used that setup for a real project, but I intend to since it seems it would be cheaper and easier, and I was wondering if you considered something like that but dismissed it.)
Also, if you don't mind sharing: what IR sensor did you use?
One workaround that could better hide the inaccuracy would have been to only have smooth colour transitions on the ribbons (including between black and white), as it appears to be a hard transition between blank and white that causes it to be so noticeable with the small positional error.