I think I explained my solution to this in another thread, but I'll reiterate it here. I wanted to make sure I didn't respond to scrollwheel events while over NGUI elements that weren't meant to respond in some way to a scroll event. So for the main client area, minimap, and three-quarter view windows I wanted the handle mouse scroll, but for hovering over any other panel or widget I wanted scroll to be ignored.
So I wrote a class (script) that I attached to every "parent" NGUI panel that makes up the UI of my app. This class uses public static variable storage of a Hashtable to keep track of all gameobjects that are part of a given NGUI panel hierarchy. On start each panel with the script attached adds itself and all of its children to the Hashtable. The key is this.gameobject.transform.instanceID. The value is the original parent's gameobject.transform.instanceID. I also use this Hashtable to be able to instantly check if a given NGUI item (gameobject) is a child of a given panel, which I used to code behaviors where a panel will auto-hide if it loses mouse hover focus.
Anyhow, with this attached to all UI items it is then very easy to have an ability to check whether or not to react to mouse events. You can create handler logic that continually stores a boolean of whether or not one of your tracked NGUI panels is being hovered. So in your non-UI code for the main interface you can do a simple check in the OnGUI (or similar) events that deal with mouse input and check if an NGUI panel is currently being hovered. If it is, just return out of the mouse handler without responding to the event.
You likely don't even need the Hashtable structure if you aren't trying to implement other behaviors. Just have a class that you attach to ALL your objects that have NGUI colliders that stores the "selected" value of the OnSelect() event to a public static boolean. Any time OnSelect is processed it updates that variable, which means it should properly follow the state of whether or not you're hovering a UI element or not.