I use system.util.invokeAsynchronous() extensively in tag change scripts, as we were running into performance issues. The pitfalls Kevin mentioned about the guaranteed order of events does not apply to my use case.
Your example may be massive improved if refactored with the new reading functions to only read (blocking) and write (async) once.
Pseudo-code:
val = currentValue.value
readlist = []
for i in range(1, 33):
                packPath = str(tagPath).replace("Battery/inNumberOfPacks","Pack{:02d}".format(i))  + "/Parameters.PackNumber"
		readlist.append(packPath)
values = system.tag.readBlocking(readlist)
writelist = []
writevalues = []
for i in range(1, 33):
      packNumber = values[i].value
      writelist.append(packPath + ".Enabled") #build packpath again
      writevalues.append(1 if val>=packNumberelse 0)
system.tag.writeAsync(writelist,writevalues)
This way you iterate quickly to build the list of tags to read, read blocking once, iterate through the tags read to build the results, and finally writing the results once. This assumes you don't have to wait after the write.