Как определить, в какой ситуации оптимальнее использовать подзапросы, а не соединения?
Тут нечего думать. Смотрите что показывает explain plan и меряйте время отклика. 

SQL как язык - это чистая теория. То есть известен результат но неизвестно каким способом конкретная dbms его достигает.  Операция explain будет зависеть от выбора dbms (Oracle, Postgres e.t.c) и будет по разному показывать реализацию алгоритма выборки для каждого select. 

Спрогнозировать как будет выглядеть план сложно. Даже разные версии Oracle к примеру могут показать разный план на одном тексте запроса.
1. подзапросы типа exists лучше для

распределенных баз
минимизации ресурса памяти и уменьшения или изъятия параллелизма

2. join лучше для

локальной базы
концентрации ресурсов на выполнении запроса

3. outer apply / lateral join позволяют использовать преимущества correlated subqueries и выбирать данные, существенные преимущества

минимизируются изменения логики выборки данных
часто удается вовлечь индексы в выборку, не обращая внимание на распределение данных  внутри домена, когда рост количества таблиц вовлеченных в inner / outer join с различными срезами данных, ведет к отказу оптимизатора запросов использовать индексы
