TAP queries follow the UWS (Universal Worker Service, see
https://ivoa.net/documents/UWS) pattern for job control, so your initial POST only creates the job and then returns the jobID. To set the job running you need to explicitly call the job 'phase' endpoint, e.g. using your example
curl -X POST -d "PHASE=RUN" -o -
https://datalab.noao.edu/tap/async/hc9qhl4rzadjao49/phase
would set the job phase to run. Without any arguments you would call that endpoint to check on the status and then similarly call the /results or /error endpoints to retrieve the results or error messages respectively. Each call has to use the jobid.
Note the queryClient interface handles these details for you, feel free to write back if you have questions about that or see the documentation on the web page.