Ваше предположение верно. Конструктор для SqlXml хранит содержимое XmlReader в потоке памяти. Он не содержит ссылку на переданный XmlReader.
Декомпилированный SqlXml конструктор:
public SqlXml(XmlReader value)
{
if (value == null)
{
this.SetNull();
return;
}
this.m_fNotNull = true;
this.firstCreateReader = true;
this.m_stream = this.CreateMemoryStreamFromXmlReader(value);
}
Таким образом, вам следует избавиться от XmlTextReader или подождать, пока он не получит GC. Первый обычно предпочтительнее, так как он более идиоматичен.