Хорошо, неважно, я нашел ответ, который, кажется, работает. Я опубликую это на случай, если кто-то споткнется и захочет избежать разочарования, которое у меня было.
Оказывается, что подсчет ссылок происходит в vtkObjectBase. Так что пока код наследует от этого, vtk будет вести точный подсчет. К счастью, vtk не позволит вам использовать vtkSmartPointer, если это не так.
Таким образом, может показаться, что для реализации макроса в стиле Boost можно просто сделать следующее:
template<typename T,typename V> vtkSmartPointer<T> vtkDynamicPointerCast(vtkSmartPointer<V> src) {
T* v = dynamic_cast<T*>(src.Get());
if (v) return vtkSmartPointer<T>(v);
else return vtkSmartPointer<T>();
}