It's not perfect, but this solution uses Delta-E color differerence formula from the Lab color space (specifically the CIE76 definition) to compare every pixel in the image to the target color. If the difference is greater than some threshold, the pixels is set to grayscale.
Thanks for Bruce Lindbloom for the correct formulas, although I'm pretty sure they are exactly correct. It seems to work well enough, so it might just be the scale that is off.
image = ChunkyPNG::Image.from_file('input.png')
green = ChunkyPNG::Color.rgb(151, 207, 63)
# this method takes an optional threshold paramter - 3.5 works for this
image.selective_color!(green)
image.save('output.png')