According to the documentation, the best you can get from the Queue operations API is ordered tasks and at least one execution of each task. However, the documentation does not specify how ordering apply. A reliable queue that guarantee the execution of an item only starts after the execution of all previous items has started would comply with this specification but would not be suitable for your use case.
You could solve this with some sort of tasks counter. When en-queuing the self-contained tasks, you increase their shared counter by the number of en-queued tasks. At the end of each task, you decrease that counter. If the counter reach zero, you can safely en-queue the final task, knowing that all previous self-contained task has been completed.
Finally, the documentation states that even a reliable queue will execute each item at least once. So the same self-contained task could be executed twice. Since you want all your self-contained tasks to complete before execution of the final task, you will need to add a safeguard to avoid the same self-contained task to decrease the counter twice.