Looks like you're interpolating the alpha channel as well. Component-wise, the mix does:
texColor1.r = dryTex.r*(1-grassTex.a) + grassTex.r*grassTex.a
texColor1.g = dryTex.g*(1-grassTex.a) + grassTex.g*grassTex.a
texColor1.b = dryTex.b*(1-grassTex.a) + grassTex.b*grassTex.a
texColor1.a = dryTex.a*(1-grassTex.a) + grassTex.a*grassTex.a
The alpha channel for an opaque dryTex will thus be
grassTex.a^2
which is transparent most of the time.
Edit: The fix would be:
void main()
{
vec4 dryTex = texture( u_dryTex, vs_texCoord *1 );
vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
vec4 texColor1= vec4(mix(dryTex.rgb, grassTex.rgb, grassTex.a), 1);
out_fragColor = texColor1;
}