Вы могли бы сделать что-то подобное, но я бы долго думал над тем, чтобы на самом деле внедрить это в рабочий код.
from n in testData.Elements("test_data")
.Aggregate(new Dictionary<string, TreeNode<string>>()
{{ string.Empty, new TreeNode<string>() }},
(d, e) =>
{
var curNode = new TreeNode<string>(e.Element("ID").Value);
d.Add(e.Element("Title").Value, curNode);
d[e.Element("child_of").Value].AddChild(curNode);
return d;
})
.Values
where n.Parent == null
select n;
Обратите внимание, что это предполагает, что элемент имеет родительский ключ "пустая строка" или входит в список источников после своего родителя.
Лично я бы отнес это (особенно агрегацию) к собственному методу.