Дело в том, что в JSON не может быть циклических ссылок по определению. Там даже нет переменных.
Лучше всего вам перейти на немного другой формат данных. А именно, хранить не ссылки на объекты, а их
ключи в виде строк. Такие строки-ссылки спокойно сериализуются.
leader.soldier = "soldier";
soldier.leader = "leader";
Автоматически лучше не конвертировать, а именно взять такой формат за основу. Но если очень хочется, то как-то так:
for (let key in obj) {
if (window[key]) obj[key] = key; //любой ваш критерий
}
В будущем для проверки, правда, понадобится чуть усложнённый код:
var test_leader = soldier.leader && window[soldier.leader];
//Конечно, вместо window у вас будет свой объект-обертка
Чтобы избавится от этого вам нужно будет всего лишь "чинить" объект после JSON.parse