It was yet another time when I tried to free a singleton pointer. Let's make clear it is not meant to be freed manually.
One cannot call ngSpice_Init() twice without unloading the dll. When calling ngSpice_Init, we pass a pointer to a NGSPICE instance and thus it cannot be changed. When any of the callback function is called with a stale pointer everything crashes.