Thank you for the question. Yes there are lot of interesting things that can be done. One thing to investigate is how synchronization works, and how to avoid interlocking/dead locks.
One scenario for example is a digital block feeding some outputs fo the ngspice block and some ngspice outputs going as inputs to the digital block.
ngspice does its time stepping calculation, so it needs inputs evaluated at a specific time. Event driven (digital) simulators on the other hand will jump to the next event, possibly skipping a huge time if nothing is changed. SO there must be some API for this, like the analog simulator generating an event in the future where the digital tool must stop at and dump the output values... I am not an expert in this area, however i have seen many cosimulations deadlocked for synhronization issues (analog waiting for digital to provide signals, digital blocked waiting for analog)...