ちなみに、同じ問題を抱えてはいるけれど
> 再帰呼び出しのために名前付き関数定義は避けられないんじゃないかね。
についてだけでいえばこう書ける。

<?php
$f = function (&$v) use (&$f) {
if(is_array($v)) {
$v=array_filter($v,$f);
return !empty($v);
}
return $v%2!=0;
};

$a = ["A" => ["a" => 1, "b" => 2], "B" => ["a" => 1, "b" => 2],
"C" => 10, "D" => ["E" => ["a" => 1, "b" => 2], "F" => ["a" => 1, "b" => 2]]];
print_r($a);
$a=array_filter($a,$f);
print_r($a);

くだ質で十分な内容のように思うけどな。