Упорные поиски ответа не дали, но нашёл сам методом догадок и экспериментов. Как это блин часто бывает.
Думаю это будет полезно здесь ответить на свой же вопрос.
Проблема заключалась в неверной подгрузке библиотеки:
hdll = LoadLibraryEx(FileName, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_WITH_ALTERED_SEARCH_PATH)
Параметр DONT_RESOLVE_DLL_REFERENCES заставляет ОС загружать DLL в пространство процесса не вызывая точку входа DLL (с параметрами DLL_PROCESS_ATTACH и др.). Вроде бы хорошо — мне эти вызовы и не требовались.
Однако без этого невозможно вызывать из DLL внешние по отношению к ней функции, в т.ч. и выделения памяти, поэтому приходится:
hdll = LoadLibraryEx(FileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
Словил граблями в лоб. Бывает.