There are a few benefits when using a shader:
Speed
The GPU is faster in manipulating pixels. Ofcourse you can 'preprocess' the texture and that will be fine. It is under the assumption that you only have a few bitmaps to process and you have the time to do this (for example right after a "choose your car color" screen).
Flexibility
So if you want to change the player's car only; sure, you can read the spritesheet, manipulate it and be done.
Now imagine you want to recolor the oppenent cars and have a busy city, this becomes unpractical. Or if you want to show a preview and the player can pick any color they want. Imagine you also want to include a variant with the car flashing white because it has hit an obstacle or something.
In that case you want to do this on the fly... which brings us to:
Memory
If you want to have multiple variants of the same car spritesheet with different colors, you would need to rebuild the bitmap for each variant. If the car is static (only shows 1 side and no animations) you could do this. If you have multiple variations and animations the bitmap becomes bigger- and all variations will grow quick. All these textures then have to be put in the GPUs memory.
Now I hear you say: "but there is plenty of memory on the GPU for my 2D game!", next is:
Performance
Closely related to the speed topic, above. But in the light of the memory one; the GPU performs at best in 2D games with as little drawcalls as possible. This is usually done by using sprite atlasses; it provides the GPU with all texture data in one go.
Having one bitmap and a few shader parameters simply provides better performance- while having much more flexibility.
Maintainability
If you have one sprite atlas for the car's movement, a variable is enough to set the color for any car in the city. If you're to build one sprite atlas to hold all car variations and the colors, you have to keep track of where the images in the sprite atlas were placed (if packed to maximize efficiency). This may be a minor thing; but it greatly helps if all assets are manipulated programmatically by properties and not the location in a bitmap.
To conclude
Having said all that; if your game has no complex scenes and is able to redraw the sprites at convenient times without impact- there is no problem doing so. Even so if you are able to combine many small variations in a sprite atlas you may be fine.
In the end: the shader route simply provides more versatility with best performance when scaling up- which is why most games go that route.