If I duplicate what you say you have, it works:
Node node = new Node() { Name = "Head" };
for (int i = 0; i < 5; i++)
{
Node subNode = new Node() { Name = $"Child {i} 0" };
node.NodeList.Add(subNode);
subNode.NodeList.Add(new Node() { Name = $"Child {i} P1" });
subNode.NodeList.Add(new Node() { Name = $"Child {i} P2" });
subNode.NodeList.Add(new Node() { Name = $"Child {i} P3" });
}
var element = (from sublist in node.NodeList
from item in sublist.NodeList
where item.Name == "Child 1 P3"
select item).FirstOrDefault();
element
contains a single node, with the correct name: "Child 1 P3".
I'd start by using the debugger to check exactly what you have in
node
and all it's subnodes - because if it works with my code, it implies your data is not as you expect.