I don't understand why the fact that the deferred functions in TestMain were not run caused a change in behaviour when using the -test.v option. Can you provide a small complete test case showing the problem?
I don't see how -test.v could affect this. Also package testing did not call os.Exit: your code did. If you don't want your program to exit, don't call os.Exit. If it does call os.Exit, there's nothing package testing can do about that.
In general it is fine to have background goroutines running at exit. And while we might look for child subprocesses, some child subprocesses might be okay (for example if the test invoked something that kicked off a background daemon as part of its operation). Inserting that kind of check into package testing seems unwise.