Абсолютно безопасно за исключением случая с указателем на виртуальную функцию, который имеет извращенный тип.
Проблемы могут возникнуть исключительно в момент разименования.
Более того, данная операция атомарна и соответственно потокобезопасна на любой архитектуре у которой размер типа указателя меньше либо равен разрядности процессора.
Возможно на некоторых других то-же, но это надо смотреть документацию.
Так что можно пользоваться невозбранно за исключением хитрых embeded систем у которых память адресуется по банкам.
но правильно такая операция пишеться
TypeA * a;
TypeB * b;
a=reinterpret_cast<TypeA *>(b);
Потому что при простом приравнивании для указателей на родственные классы начинает работать таинственная адресная магия, которая требует возможности их разименования.