На моей памяти весьма пригодились 1 раз на проекте, когда другой разработчик поставил их в недореализованных методах на серверной стороне, которые тихо компилялись и никем не вызывались, пока я клиентскую сторону для данного функционала не написал. Когда работа моего компонента стала приводить к вызову этого кода, сразу стало ясно, где заглушка и что нужно доделать
Хотя всё то же самое можно было бы сделать через механизм исключений, в принципе. Но и это лучше, чем вляпать код возврата типа NOT_IMPLEMENTED (или, что хуже, какой-нибудь ОК) или просто копи-пастом вставить из похожих методов рабочий код и забыть об этом напрочь (а бывали и такие случаи в практике:) ).
Другой случай, который видел и на который обращал внимание - в opensource-овом видеокодеке t264 (реализация стандарта H.264), код на С. Там ассерты нужны были для проверки корректности компрессии-декомпрессии видеопотока: как только кодек переходит в какое-то не такое состояние - ассерт. Пригодились, когда кодек подвергся экспериментам по настройке, выбрасыванию лишних деталей и оптимизации оставшихся
Ещё много где встречались, но в основном с одной целью - для проверки в режиме отладки передаваемых в функцию параметров. Это не исключало саму проверку в коде, а дополняло её.