Вообще что-то я не оч понимаю в чем заморочка. Если есть рекурсия, то коли она находится в обоих объектах на одном и том же месте и ведёт на один и тот же уровень - они, по данной логике, равны.
Те навскидку можно так(без учёта нод, ибо лень и сложно):
Object.prototype.toString=function(){
var objects=[];
return function(){
var n=objects.indexOf(this);
if(n>-1)return '[recursion up to level '+n+']';
objects.push(this);
var str='{', j;
for(j in this)str+='\''+j+'\': '+this[j]+',';
objects.pop();
return str.slice(0,-1)+'}';
}
}();
var a = {ня:3};
var b = {ня:3,'a':a};
a.a = b;
alert(a.toString() == b.toString())
alert(a.toString() +'\n\n'+ b.toString())