Your service callback is running as part of a transaction.
The service callbacks gather all changes that you want to make to the data model, and only when all those callbacks return, all changes are sent to the devices using the NEDs.
For that reason, if you want templates to be applied one by one to your devices, they need to be part of different transactions, which means, a different run of the callback.
In most cases though, the NED is in charge of pushing the changes to the device in such sequence that all configs can be pushed as part of the same transaction (and it shouldn't matter in which order you actually applied the templates).
If you still need the different templates to be pushed one by one, you can add a new leaf to your service, e.g. 'service-phase', and change your callback pseudo code to be something like this:
tvars = ncs.template.Variables()
template = ncs.template.Template(service)
...
if phase 1:
template.apply('template_1', tvars)
if phase 2:
template.apply('template_1', tvars)
template.apply('template_2', tvars)
template.apply('template_3', tvars)
if phase 3:
template.apply('template_1', tvars)
template.apply('template_2', tvars)
template.apply('template_3', tvars)
There are also mechanisms to move between the phases in an automated way, but before you go there, convince yourself that this is indeed what you're after.