Вы правы - нет способа сделать это в одном запросе SOQL.Обратите внимание, что ваш второй требуемый запрос также не даст вам правильных результатов (он вернет запись, только если у непосредственного родителя дочернего аккаунта нет родителя).
Лучше всего делать то, что вы сказалив вашем первом блоке кода.Вы можете просматривать отношения до 5 объектов в глубину, поэтому вы можете включить parent.parent.parent.parent.parent.id в ваш выбор SOQL.Выполните итерацию по полям - если ни одно из них не равно нулю, то выполните второй запрос SOQL, который изменит CHILD_ID на значение parent.parent.parent.parent.parent.id.Таким образом, вы гарантированно в конечном итоге найдете родителя без родителя (поскольку salesforce гарантирует отсутствие циклов).
Вы можете сделать это более элегантно, только выбрав parent.id в запросе и выполнив больше отдельных запросов,но это заставит вас столкнуться с ограничениями API / регулятора, так что это, вероятно, не очень хорошая идея.
Если бы вы могли использовать пользовательский объект вместо Account, вы могли бы сделать что-то вроде второго запроса, так как вы быв состоянии проследить отношения родитель-ребенок от этого пользовательского объекта к себе, но я все еще не уверен, что есть один запрос, который даст вам то, что вы хотите.