Minhas conclusões:
1) Tanto a utilização do callback "before_destroy", quanto fazer um overload do método "before_destroy", funcionam. Isto é, retornando "false" o "destroy" é abortado.
2) Onde, então, está o problema? Se na declaração do "has_many" for utilizada a opçao ":dependent => destroy" em relação ao filho - o que, convenhamos, não faz sentido, pois é justamente o que se quer evitar ;-) - os registros do filho serão excluídos antes da validação. Isto é, o "dependent => :destroy" é executado antes do "before_save". Aí, quando o "before_save" é executado, não há mais registros filhos, pois já foram excluídos.
3) Mas e se eu quiser usar o ":dependent : => destroy" junto com o "before_destroy", tem como? Tem. Simplesmente declare o "before_destroy" ANTES do "has_many". Como está bem descrito na documentação, o Rails executa os callbacks na ordem em que aparecem.
Obrigado à todos.
Abs,
Ivan