Is there other, or correct way?
Sure, there's tons of ways to "show the status of the enemy" and maybe not even with color. This is a very subjective question but it comes down to what you think looks best and what works with the rest of your game.
In case of use vertex shader, how I change the color of enemy without losing all details (Something like a filter)?
This is a much more concrete question. If you want to apply colors without losing any of the details, you're probably going to look at some sort of tinting of the character.
What you can do is have a custom uniform value in your fragment shader (not the vertex shader!) that will render all the pixels of that object with a tinting. The easiest way to do this is just with multiplicative blending. Multiplicative blending is simple in that a 1.0 in a given channel will let original color pass through while a 0.0 will produce no color in that channel. A value in the middle gives a partial pass through (darker color).
uniform vec4 tintColor;
void frag(out vec4 fragColor)
{
vec4 originalColor; //Comes from original object color
return originalColor * tintColor;
}
Multiplicative blending is not the only one and you should consider other types of blending (or even more complex forms of tinting) by doing research until you find something that fits with your design.