It seems your issue then lies in you not using NGUI properly. Whatever custom input you have going on, needs to go through NGUI. Note how UICamera has various callbacks, such as UICamera.onCustomInput? This is what you should be using to set your custom input sources. Look at UICamera.ProcessFakeTouches for an example.
You can also override UICamera's GetKey, GetAxis, GetKeyUp, GetKeyDown functions if your input comes from an alternate source, such as the InControl plugin.
I'm not sure how the hoveredObject ever worked properly for you to begin with if you weren't letting NGUI handle your input code.
While you can install an older version of NGUI (and Pro users have access to the entire Github repository with all the history), I would strongly advise you to correct the issue properly rather than hacking around it and only making it worse.
OnDragOut must always fire if OnDragOver was fired. Otherwise the object will always be in the "drag over" state even when the event ends.
In your generic OnDragOver simply record what you're currently over, if you prefer. Then simply use this value in your function the same way you were using hoveredObject. You don't even need to change to null it in OnDragOut.
using UnityEngine;
public class HoveredObjectHelper : MonoBehaviour
{
static public currentObject;
void Awake ()
{
UICamera.onDragOver = MyDragOver;
}
void MyDragOver (GameObject go, GameObject obj)
{
if (go != null && obj != null) Debug.Log(obj.name + " dragged over " + go.name);
currentObject = go;
}
}