That's a VERY good question, Lane.
Just on the surface, it doesn't look like anything strange would be going on.
However, the line above the call to the grid you're looking for frmCust and you're assigning it to the variable frmStatus. The grid line you're doing a call of WaitVBObject off of frmCust and assigning it to gridStatus.
Is this your intent to assign the VBObjects to those variables?
Additionally, you're waiting up to 3 seconds for frmCust to appear... when you get to your Grid call, are you certain 3 seconds was long enough?
A "best practice" I always use is that, when using one of those "WaitXXXXObject" calls, to follow it up first with an "if it exists" check. It's entirely possible that, in this one instance of your script code, frmCust may not return within 3 seconds and you may need to wait longer. You MIGHT be getting caught in some sort of internal update where frmCust may still be in the process of resolving some sort of internal method before you get to the Grid.
Double check to see if frmCust exists before you go further. Something like:
set frmCust = Sys.Process("MyApp").VBObject("frmMain").Window("MDIClient", "", 1).WaitVBObject("frmCust", 3000)
if frmCust.Exists then
set grdStatus = frmCust.WaitVBObject("GridEXCustomers", 2000)
else
Log.Error("The form didn't exist when I wanted it to")