I work on a terrain plugin and I've been thinking about this for a while.
The approach I may try soon is to use a texture array, and sample a slice of that array in a shader based on the index of the texture in the splatmap (so it would not be colors like you said, but more like a specialized splatmap painted with a specific tool, although you could feed in such color textures and generate a proper splatmap from it).
That kind of splatmap would be different from the classic RGBA=1234, instead it would be R=textureIndex1, G=textureIndex2, B=blendingFactor. Then in the shader, color could simply be calculated like this:
// Not true code, only as example
vec3 index_and_weight = texture(u_terrain_splatmap, cell_position);
float index1 = index_and_weight.r * 255;
float index2 = index_and_weight.g * 255;
float weight = index_and_weight.b;
vec4 color1 = texture(u_texture_array, vec3(ground_uv, index1));
vec4 color2 = texture(u_texture_array, vec3(ground_uv, index2));
ALBEDO = mix(color1, color2, weight);
The first downside I find so far is that you have to find out how to actually paint such a splatmap, because a constraint is that you cannot have a pixel of the ground that blends more than 2 textures. However, that can be largely enough if taken care of, and the texture array allows for up to 256 different textures, as long as your graphics card can handle it.
I don't know if that helps, it's only theory, I have yet to actually try this out ;)