Thanks for the help, I was able to track down the problem after reading your post. I have made a "fix" that is working well, however, I have still not proved out exactly what the problem was (scary, I know).
I am not destroying the reference on purpose, but here is what I found/think was going on... My top level VI calls other VI's dynamically using a plugin architecture by way of VI Server and Sub Panels. If i do not first run that Get Public Events FG in my top level vi (the one that creates the events), it instead gets ran for the first time when I initialize my VI's into the sub-panel; after initializing my plugin VI's into the sub panel, the user can then (again) recall any one of the plugin VI's by selecting it from a multi-column listbox. (I initialize my plugins this way because I need them to communicate to my top-level VI whether or not their hardware is available, or in simulation mode)
My theory - So then if the top level VI does not first call the Get Public Events, it gets ran first by a plugin VI during initialization, but after initialization, the sub panel VI basically goes out of existence, and so the refnum(s) is no longer valid, but is still in the FG. Does this sound correct??
Unlike queue event refnums, when I probe a user event refnum, it does not tell me whether the reference is still good or not (this makes debugging a pain).
I like your idea of throwing some sort of message when the references are no longer valid, but how would you know when they are no longer valid, other than the specific instance of when you destroy them (which is not the problem in my case).