Записи являются типами значений, а не ссылочными типами. Это означает, что все записи, используемые в качестве элементов более крупной структуры данных, помещаются внутри самой структуры, а не как указатель. Попытка создать две записи, которые содержат друг друга, приведет к тому, что компилятор попадет в бесконечный цикл, пока он пытается выяснить структуру записей. Это, вероятно, причина, по которой вы не можете заранее объявить запись, и даже если вы пытаетесь вставить сюда ссылочный тип (динамический массив), вы все равно не можете нарушать правила языка.
Но вы можете объявить тип указателя на запись как прямое объявление, например:
PMyRec2 = ^MyRec2
...
MyRec2 = record
...
end;
Конечно, как только вы начнете использовать указатели на записи, вам придется беспокоиться о выделении и освобождении памяти, и сложность кода, которую вы пытались избежать, не используя классы, появляется в вашем проекте. Итог: сделайте это с классами. Сделайте одну из записей, если не обе, классом. Это действительно самый простой способ.
И дополнительные затраты памяти незначительны. Он указывает на указатель на объект для каждой ссылки, который вам в любом случае понадобится для указателей на объекты, плюс одно скрытое поле (4 байта) на экземпляр перед D2009 или два из них (8 байт) на D2009 или более поздней. Это совсем немного.