The problem actually has nothing to do with loss of precision or gimbal locking. The problem is that when the orientation is close to one of the poles, no azimuthal rotation produces a change in the camera position that is large enough to trigger a `change` event...

		if ( lastPosition.distanceToSquared( this.object.position ) > EPS ) {

			this.dispatchEvent( changeEvent );

			lastPosition.copy( this.object.position );

		}

This condition is just completely wrong. It only takes into account the position of the camera. Near the poles, the position is almost fixed and the up vector varies rapidly.