Answering my own quesion in case anyone else runs into this or I forget what I did.
Tackling the Cyclic object issue first, I remembered that the page configuration object contained jQuery objects. I can't (don't want to) use that in my Selenium stuff anyway so I did this instead:
const foo = JSON.parse(await driver.executeScript(`return JSON.stringify(Bar.options.theOneIWant, function (key, value) {
if (value?.jquery)
return {
id: value.attr('id'),
value: value.val()
};
else
return value;
});`));
Et voila! I have a collection of customization options which bypasses the jQuery stuff while keeping some values just in case I want them later. In addition, the StaleElementReferenceError magically disappeared. I expect it was one
of the many nested jQuery objects pointing to various bits of the DOM I need to manipulate. Those items get regenerated when the CMS rewrites the DOM so I don't care to test that particular error.
Shorter answer and more work would be just to eliminate jQuery from my customization code. Screw that, it makes my life easier.