В общем, с помощью флага
--profile
удалось установить причину. Все упиралось в недостаток памяти. Увеличил объем RAM до 1Гб (было 384Мб) и update успешно завершился. Пик использования памяти при этом был равен 569.84Мб.
Дополнительно, для тех, кто в будущем столкнется с подобной проблемой, на
github я обнаружил еще одну возможную причину такого зависания. Суть ее, как я понял, заключается в том, что при большом количестве зависимостей composer может "зависать" из-за большого количества их возможных комбинаций. Такое случается очень редко, но теоретически возможно. Решение в данном случае: задать требования более строго. Например, использовать более конкретные рамки версий, или вообще указать точную версию.