Хорошо, я решил (с помощью подсказки global.asax от citronas).
Как всегда, оказывается, что я утверждал в своем вопросе и комментариях вещи, которые были не так верны, как я предполагал.
Первые два вызова фактически не выполняются последовательно, но второй был сделан до того, как первый успел вернуться. Это привело к двум вызовам Session_Start (интересно с тем же идентификатором сеанса). Поэтому данные первого сеанса перезаписывались.
Изменение моего приложения на ожидание каждого звонка решило проблему.
Спасибо всем, кто ответил или прокомментировал.