Я бы выбрал здесь немного другой подход. Я бы сначала написал код, который превращает ваше дерево (которое, как я полагаю, действительно дерево, а не произвольный граф) в последовательность узлов. Что-то вроде:
static IEnumerable<Node> AllNodes(this Node node)
{
var stack = new Stack<Node>();
stack.Push(node);
while(stack.Count > 0)
{
var current = stack.Pop();
yield return current;
foreach(var child in current.Nodes)
stack.Push(child);
}
}
и теперь вы можете использовать операторы последовательности:
bool allChecked = root.AllNodes().All(x=>x.Checked);
Нет рекурсии, нет проблем.