1. Алгоритм переделывать не будут. Уверен на 100%. Объясню почему. Алгоритм использует экранное представление примитивов и соответственно ограничен размерами экрана (или чуть больше). Такой алгоритм существенно (возможно на несколько порядков) быстрее, чем сканирование всего пространства Модели/Листа. По поводу изменения алгоритма уже обращались - ответ читай выше.
2. Можно конечно придумать массу разных алгоритмов, ускоряющих работу, но перебрать все примитивы пространства Модели/Листа всё равно придется.
Например можно проверять пересечение BoundingBox. Кстати, IntersectWith работает далеко не со всеми примитивами. Для некоторых типов примитивов (например, BlockReference) он находит точки пересечения не с примитивами блока, а с его BoundingBox