Функция HeapAlloc не задает гарантии выравнивания на странице MSDN, но я склонен думать, что она должна иметь те же гарантии для GlobalAlloc, который гарантированно возвращает 8-байтовую память, выровненную (хотя и полагается на недокументированные функции это зло); в конце концов, прямо сказано, что Global / LocalAlloc - это просто оболочки вокруг HeapAlloc (хотя они могут отбросить первые n байтов для выравнивания памяти - но я думаю, что это очень маловероятно).
Если вы действительно хотите быть уверенным, просто используйте GlobalAlloc или даже VirtualAlloc, гранулярность которого - гранулярность страницы, обычно 4 КБ (IIRC), но в этом случае для небольших выделений вы будете тратить много памяти .
Кстати, если вы используете новый оператор C ++, вы гарантированно правильно выровняете память для указанного вами типа: это может быть путь.