Провел тест на чистом PDO, поменял несколько версий, но результат тот же. Метод PDO::lastinsertid возвращает самый последний id для таблицы, как функция MSSQL IDENT_CURRENT()
То есть, если между вставкой и получением id произошла вставка в другой сессии, то возвращается id из второй сессии.
Свою проблему решил созданием хранимой процедуры для вставок в самую часто-используемую таблицу, в которой выходной параметр заполняется функцией SCOPE_IDENTITY().
Кстати, используя выходной параметр в хранимой процедуре, не стоит забывать про инструкцию SET NOCOUNT ON, которая отключает вывод количества затронутых процедурой строк вместо выходного параметра.