I'd use the same vertex/fragment shader combination in both cases. In the second case I'd set the colour vertex attribute to a constant no-op value (all 0.0 or all 1.0 depending on how you use it in the fragment shader). This is easily achieved with a single call to glColor4f or glVertexAttrib4f before making the draw call, assuming the bound VBO has no colour data.
I think you've got it backwards - my sprite is
always sending position+colour+uvs, but a shader with an unused colour attrib has the colour attrib optimised out, so the sprite errors as it can't lookup the 'colour' attrib from the shader.