Пообщаюсь немного сам с собой. Надеюсь, кому-нибудь будет полезно.
В одной из LIB оказалась глобальная переменная типа double, которую линкер не соптимизировал.
Эта переменная инициализируется примерно так:
const double x = std::numeric_limits<double>::signaling_NaN();
Инициализация происходит в функции _CRT_INIT(), которая вызывается до DllMain. Я ещё не до конца разобрался, но вставляя разный код и вызывая _statusfp() я понял, что эта инициализация изменяет "floating-point status word". Конкретно эта строчка выставляет бит _EM_INVALID. Ну а если кто-нибудь потом поменяет маску FPU исключений и заенэйблит эти исключения, то FPU исключение и полетит.
Видимо, при входе в Dll все FPU исключения отрублены, инициализация переменной выставляет флаг _EM_INVALID, по возвращению в VBA маска исключений меняется и исключение бросается.
Желаю всем пореже сталкиваться с таким гЭ. Пис!