Instead of using "overlaps at offset" use an array to store the grid for a quick lookup. So if your blocks are 32x32 and have a top/left hotspot, and your layout is 640x480 then your array size will be 640/32 x 480/32 or 20x15. Then fill your array with 0 for empty and 1 for filled if a block is there. Your initial event will look like this:
Start of layout
for each block
--- set array at int(block.x/32), int(block.y/32) to 1
Then later on for the simple case of instantly growing grass you can see if it's empty above the block like this:
for each block
array at int(block.x/32), int(block.y/32)-1 = 0
--- grow grass
Anyway regardless, I still think the second part of my last post will work for the situation of the grass growing from the left to right, one per time frame.
I whipped up an example and I think I found an alternate method that would work better. Basically have the grass grow next to another grass every 0.5 second, but on every 2 seconds make a random sprite grow grass instead. That would solve the issue of needing an initial grass to grow from.
https://dl.dropboxusercontent.com/u/5426011/examples19/grass%20grow%202.capx