Специального признака того, что объект освобожден нет.
Жаль. Этот функционал не помешал бы.
Несмотря на то, что у тебя при вызове Database.ReclaimMemoryFromErasedObjects возникает исключение, тем не менее (согласно документации) все объекты обрабатываются, а исключение генерируется если хотя бы один из объектов уже освобожден (см. описание метода AcDbDatabase::reclaimMemoryFromErasedObjects).
Т.е. вы хотите сказать, что исключение вываливается не на первом же уже удалённом объекте, но "в уме" запоминается, что такой объект присутствует и пробежав по всем элементам, обработав нужные, исключение вываливается после полной обработки? В этом случае просто нет смысла в исключении, поскольку AutoCAD мог просто в итерации пропускать "инвалидов" и обрабатывать только "валидов". Если так, то будет достаточно этот код засунуть в try\catch с пустым catch.
UPD Странно, что после вызова
Database.ReclaimMemoryFromErasedObjects повторная итерация по
Database снова находит эти
ObjectId. Логичней, на мой взгляд, было бы для их
Handle в
Database.TryGetObjectId возвращать
false, чтобы не сбивать с толку.