Я сам не пробовал, но похоже, что hitTest: withEvent: будет делать то, что вы хотите.
В документе говорится, что он просматривает иерархию представлений, вызывая pointInside: withEvent для каждого подпредставления, что, вероятно, в конечном итоге вызывает CGRectContainsPoint, поэтому, вероятно, это происходит не быстрее. Вероятно, я бы все же попробовал это, вместо того, чтобы перебирать подпредставления вручную.