Hi Rudolf,
I did some digging in imx-atf_1.0.bb and saw that it copies bl31-imx8mq.bin to the imx-boot-tools folder in do_deploy().
In imx-boot_0.2.bb I can see that its do_compile is setup to run after imx-atf's do_deploy:
do_compile[depends] += " \
    virtual/bootloader:do_deploy \
    ${@' '.join('%s:do_deploy' % r for r in '${IMX_FIRMWARE}'.split() )} \
    imx-atf:do_deploy \
    ${IMX_M4_DEMOS} \
    ${@bb.utils.contains('COMBINED_FEATURES', 'optee', 'optee-os-imx:do_deploy', '', d)} \
"
As I have learned that is exactly the mechanism used to instruct one recipe to only be executed after a specific step in another recipe.
I think that if that piece of code was not there, my problem would be exactly what you described: imx-boot:do_compile executing after imx-atf:do_install but before imx-atf:do_deploy.

I followed your advice to build imx-atf on its own (which worked) and I think I know why my build failed:
I was not aware of imx-boot depending on imx-atf. While I was trying to get my new distro to work I at one point deleted the imx-boot-tools folder manually. I now realise that that is not a smart move.
Additionally I ran bitbake -c clean imx-boot. But not bitbake -c clean imx-atf, because I was not aware of it existing.
That likely led to imx-boot being rebuilt at next build, but imx-atf being considered up-to-date by bitbake. So it didn't bother building it again.
But because I manually removed some of the files imx-atf would produce, and upon which imx-boot depends, the build failed.

So in the end your explanations, hints and advice helped me understand more about how bitbake recipes interact with each other.
It would have probably been very difficult for you (or anyone) to spot my real problem since you could never have anticipated me just taking a shotgun to the files in my deploy directory :D
Nevertheless I want to thank you for your help.

I consider this issue solved.

Stefan