If the async task fails 3 times (the number of retries are configurable by the way), the job is kept in the database with 'retries = 0'. This won't be retries anymore, unless triggered manually by the API (or explorer). If you have async stuff in your process, you should have a mechanism that inspects the failed jobs (see JobQuery, this offers functionality to find those jobs and look at the exception that occurs) on a regular basis.
Anyway, the process won't move on and will be "waiting".