Вы вызываете функцию рекурсивно, но предоставляете только один возврат.Если вам случится найти узел, который вы ищете, на втором уровне, вы вернете значение только на первый уровень, который ничего с этим не сделает.
Может быть, вы хотите что-то вроде этого (непроверенный код):
function get_node_by_id (xml, nodeId)
for i=1, #xml, 1 do
if get_attr_by_name(xml[i], 'Id') == nodeId then
print ("TRUEEEEE", i, xml[i])
return xml[i]
else
local node = get_node_by_id(xml[i], nodeId)
if node then return node end
end
end
end