Добрый.
Во-первых, не стоит путать Surface (математическое описание поверхности, кстати, Plane - это класс-наследник Surface) и TopographySurface.
Сам TopographySurface не очень удобный объект для работы в данном случае, т.к. его геометрия - это Mesh. Собственно, первый вариант - это перебор его треугольников, последовательно проецируем точку на плоскость каждого треугольника и проверяем дальше, что проекция оказалась внутри треугольника. Альтернативный вариант - на 3D виде найти искомые проекции с помощью ReferenceIntersector-а.
Псевдокод:
var intersector = new ReferenceIntersector(new[] {toposurface.Id}, FindReferenceTarget.All, view);
var intersection = intersector.FindNearest(point, XYZ.BasisZ) ?? intersector.FindNearest(point, -1*XYZ.BasisZ);
return intersection?.GetReference().GlobalPoint;