Получил подтверждение от команды PowerShell на этот раз. Это похоже на ошибку в адаптере XML. Если вы посмотрите на объект, который выдает foo2 в отладчике, это PSObject. Если вы не используете ключевое слово return и вместо этого просто выводите строку «foo2», то функция возвращает строковый объект.
Ошибка в адаптере XML заключается в том, что он не разворачивает объект PSObject, чтобы получить базовый объект. В результате, когда он пытается назначить объект PSObject для $ xml.node, происходит сбой. На данный момент, в качестве обходного пути, вы можете вручную развернуть psobject следующим образом (или просто привести к [string]):
$xml = [xml] '<node>foo</node>'
function foo2 { return "foo2" }
$xml.node = (foo2).psobject.baseobject
$xml
node
----
foo2