I like to use the Asynchronous Call and Forget function to start parallel loops, as it allows me to launch the parallel VI when all the prerequisites for it have been met. It can also be done from within another loop without compromising Data Flow.
Sadly, sometime my code doesn't work 100% of the time, and the detached VI keeps running (even though I thought I told it to stop). I've also had the situation of stopping LabVIEW and getting a warning that one or more VIs will have to stop.
Is there a programmatic way to "find" all of the VIs that have been started (and are still running) Asynchronously? If so, one could (in principle) interrogate them, abort them, or simply "know about them". I thought that maybe the Invoke Node "All VIs in Memory" (one of the Application Methods) would work, but it doesn't find the detached nodes.
To date there is no publicly available way to get a list of cloned VIs, other then by guessing what the VI names are. Starting in 2013 there are extra debug tools and you can go to View >> Browse Relationships >> Reentrant Items. Admitidly I don't know under what circumstances VIs will show up here so your method of making clones may not cause them to be listed here.
There are two only other way I know of getting clone references. One is to keep track of them your self. When you make a new clone you can keep its reference in an array with all the others maybe in a functional global, then on close put that into a for loop and abort them all.
Or the crappier solution is on exit you could open a VI reference to something like "VI Name:1" through "VI Name:100" and abort them all. Now some may not be valid, and you may miss some if you have a clone with a name greater then 100.