Это потому, что вы используете возвращение доходности с IEnumerable.
Как только вы переберите результат своей функции, код будет выполнен. Это называется отложенной оценкой и также является ключевым аспектом LINQ. Чтобы понять отложенное выполнение, прочитайте this .
На самом деле, у вас есть другая ошибка. Ваш код даже не вернет результат вашего рекурсивного вызова. Вы ничего не делаете с этим. Вам нужно будет сделать это:
yield return v;
foreach (var child in GetAllChildren(v))
{
yield return child;
}