You have a couple of options.
If you want to vary the actual textures you can combine several populations of the grass model, each one using a different texture file, with power fractals plugged into the populations shaders' density slots to mix things up.
With grass it's probably OK to let the populations overlap. Things get a little more involved if you want each population to have its own space. There are a few threads on the forum describing different ways to do this.
If you just need to vary the color shade across the population, that's much simpler. Just use a power fractal (or several) to create a color mix, and feed the result through a transform input shader, with worldspace enabled, before connecting it to the object's color network.
Finally, the technique used in the attached screenshot randomly varies color saturation across placed objects and populations. It's a good way to break up solid areas of color. Credit for this goes to Dune. The constant color is set to white, and color is disabled in the surface layer. Tweak the power fractal settings (seed, color, scale) as needed.