Думаю можно и без перебора
вроде того:
Vector3f vectorA = segment.positionA - box.center;
Vector3f vectorB = segment.positionB - box.center;
Vector3f min_vector = ( dot( vectorA ) < dot( vectorB ) ) ? vectorA : vectorB;
x = sign( min_vector.x );
y = sign( min_vector.y );
z = sign( min_vector.z );
Vector3f closest = box.center + box.extent * Vector3f( x, y, z );
фишка в том, что знаки вектора "бокс-сегмент" ( конечно без нуля: -1, +1 ) как раз и определят ближайшую вершину, а ее позицию можно вычислить сдвинув центр бокса, на его полуразмеры по получившейся из этих самых знаков оси.
ЗЫ
хотя я это не проверял, просто мысль
