Widget state changes is a different thing than user input. The state is maintained in that nothing changes from Update to Update unless you initiate or cause the change. In that manner, the UI sate is persistent.
Input is based on UICamera, which in Update checks Input.touchCount (and similar for other input methods) and then notifies the collider that's been hit by the input. So I suppose it's sort of a hybrid of polling and event based, as the raw input is taken through polling, while further input handling is propagated out to only the relevant widgets/colliders.
Right now you can't limit how often it polls and for performance reasons it's not needed anyway - it's just doing a for loop of up to 10 touches + mouse + joystick/controller, and when those inputs are not there, it's just a skipped for loop. (See UICamera:Update() for details).
Nothing is interactive unless there's a collider on it, so if you remove the collider, it's not interactive.
As far as I know, you can't change it out to completely event driven since unity doesn't have any events that get fired when input is registered, but it is a close as you can get.