require した側で require された側の変数を参照するのは、module.exports で指定してあげた変数を素直に参照する方法で可能です。
required.js
module.exports.foo = 'fooの値';
require.js
let required = require('./required.js');
console.log(required.foo); // fooの値
この逆を行いたい場合。つまり、require された側で require した側の変数を参照するには module.parent.exports を使います。
required.js
console.log(module.parent.exports.bar); // barの値
require.js
module.exports.bar = 'barの値';
let required = require('./required.js');
複数回 require された側で参照するには、 require された回数分 parent をつなげて参照します。
required_2nd.js
console.log(module.parent.parent.exports.val); // valの値
required.js
let required_2nd = require('./required_2nd.js');
console.log(module.parent.exports.val); // valの値
requre.js
module.exports.val = 'valの値';
let required = require('./required.js');
ファイルの require する/されるの関係や構造が変わるとあれやこれや修正しないといけなくなるので、そこはうまくないのですがグローバルを汚染することは手軽に避けることができます。
クロージャを使う方法もあるようなのですが、複数回 require された場合のケースではとても複雑なことになりそうなので見送っています。