There are solid answers here already - I just want to chime in with one more common way you'll see vertex colours used:
Varying object colours (or other attributes) within a single batch / draw call.
You'll see this used in rendering particle systems, text, and batched (usually atlassed) sprites.
Imagine you have a particle emitter that spawns particles with a random start colour, or that fade to 0 alpha over the particles' lifetime. If we were to use shader uniforms to send this colour data, we'd need to draw each differently-coloured particle in its own draw call, making the particle system much more expensive. Instead, we can bake these colours into the vertex data for the particles, and render the whole batch together in a single call.
Unity appears to use this technique for particle colour variation, as well as for colouring individual characters in a TextMesh or Sprites rendered together in a batch.
I believe you can do something similar with geometry instancing, but I don't know how the two compare in performance. It's possible that today doing this type of instanced tweaking through vertex colours is more of a hold-over to support pre- OpenGL 3.1 / DX9 hardware like some mobile devices, rather than a best practice for modern PCs. I'd welcome comments from folks who've done more performance tuning with batches & instancing to help clear up whether these techniques have superseded vertex colours for this purpose. :)