When the async task completes, it could set bound values in a properties table that control UI elements in the custom manager section. E.g. there could be a static_text() that initially shows "Searching for external tool", and when the search finishes, the task sets it to "Found external tool" or "You need to install external tool". You could control the visibility of other elements, etc. as well.

But in general, if you want one async task to wait for a condition (e.g. the completion of another async task), you need to use a spin loop:

while not completed do LrTasks.sleep (0.25) end

While this offends the more delicate architectural sensibilities, practically it works very well and consumes very little CPU, as long as you program it carefully. A number of my plugins are forced to do this for various reasons.