No particular reason. You can try it yourself to see if it makes any performance difference in your project (I doubt you will ever have 10k active widgets, or even 1000 for that matter!) -- change UIRect.Update to be UIRect.CustomUpdate, then call it from UIPanel.UpdateWidgets inside the iteration loop:
for (int i = 0, imax = widgets.Count; i < imax; ++i)
{
UIWidget w = widgets[i];
// If the widget is visible, update it
if (w.panel == this && w.enabled)
{
w.CustomUpdate();// <--
Edit: Actually there is a reason, now that I think about it... custom update like that won't be called at edit time when working with the component -- such as changing the text of a label. Unity will call Update() of the component you're changing, but it won't call Update() of another component.