It is true that Ada has both stack-allocated task objects and heap-allocated task objects. For stack-allocated tasks, the tasks are awaited before the scope where the object is declared goes away. The creation of a heap-allocated task object produce a pointer value of a particular “access type,” and the place where that access type is declared determines the scope where such a task is awaited. Normally such access types are declared at the library level, meaning that it is only when the program is about to exit that it awaits such tasks.
Lighter-weight concurrency constructs are in the process of being added to Ada for the proposed 2020 version of the language. These are all “structured” concurrency constructs – parallel loops, parallel blocks, and parallel map/reduce constructs. The existing Ada heap-allocated tasks will remain the only way to “spawn off” a thread of control that runs indefinitely.