The selected answer proposes 2 ways both waiting termination of all "spawned" async functions.
My proposal is instead to spawn each asynch function using setImmediate (nodejs ~equivalent to setTimeout(0)) to run each function and get intermediate results before teh completions of all functions:
for (let i = 0; i < numSpawns; i++ ) {
  // nodejs
  setImmediate( async () => { console.log( await runAsyncFunction(msecsMax) ) } )
  // browser
  // substitute setImmediate with setTimeout( await runAsyncFunction, 0, msecsmax )
}  
Complete demo code
/**
 * parallel.js
 * demo, to "spawn" in parallel multiple async functions
 */
/**
 * sleep
 * warp setTimeout, returning a value
 *
 * @async
 * @param {Number}  msecs number of milliseconds
 * @return {Number} msecs
 */
function sleep(msecs) {
  return new Promise(function(resolve /*, reject*/) {
     setTimeout( () => { resolve(msecs) }, msecs )
   })
}
/**
 * randomInteger
 * Returns a random integer number between min (inclusive) and max (inclusive)
 * @param {Number}  min
 * @return {Number} max
 */
function randomInteger(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
/**
 * runAsyncFunction
 * simulate an async function, 
 * returning, after a random number of msecs, the number of msecs
 *
 * @async
 * @param {Number}  msecsMax max duration in milliseconds
 * @return {Number} random number of msecs
 */
async function runAsyncFunction(msecsMax) {
  const msecsMin = 500
  return await sleep( randomInteger(msecsMin, msecsMax) )
}
async function parallel(numSpawns, msecsMax) {
  for (let i = 0; i < numSpawns; i++ ) {
    // nodejs
    setImmediate( async () => { console.log( await runAsyncFunction(msecsMax) ) } )
    // browser
    // substitute setImmediate with setTimeout( await runAsyncFunction, 0, msecsmax )
  
  }  
}  
async function main() {
  const msecsMax = 3000
  const numSpawns = 10
  
  // runs in "parallel" 10 async functions, 
  // each one returning after a sleep of a random number of milliseconds (between 500 to 3000)  
  parallel(numSpawns, msecsMax)
}
main()
Run the program:
$ /usr/bin/time --verbose node parallel
1204
1869
1983
2042
2119
2220
2222
2611
2642
2660
    Command being timed: "node parallel"
    User time (seconds): 0.07
    System time (seconds): 0.00
    Percent of CPU this job got: 3%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.72
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 31568
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 2160
    Voluntary context switches: 39
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0