After digging around for a while, it looks like this is not possible. The closest I got was an OSL script using traceset to find the value, but it turns out that Blender OSL doesn't implement traceset.


I did come up with a workaround that more or less does what I want:

 1. Create an additional vertex group (I called it `water.edge`) on the emitter and assign all vertices to it.
 2. Add a Vertex Weight Mix modifier to the emitter, which copies the original `water` vertex group to `water.edge`.
 3. Below that add a Vertex Weight Edit modifier that edits `water.edge` and applies a custom falloff curve that starts at 0, rises to 1 then falls back to 0. This makes `water.edge` have its highest values where the `water` values are intermediate.
 4. Create a new particle system `yellow grass`, and use separate yellow grass variant particles.
 5. Use the `water.edge` vertex group to control the density and length of the `yellow grass` particle system.

Downside is the texture doesn't "blend" from one region to another, but at least I can get dry grass where I want it.

[![Here's a picture of that part of the modifier stack.][1]][1]


  [1]: https://i.sstatic.net/Q218X.png