Isso é complicado. A principal coisa a entender é que o systemd inicia tudo em paralelo, a menos que seja dito que não. Isso é realmente indicado na página man na seção "Requer":
requirement dependencies do not influence the order in which services are started or stopped
O que você quer é "esperar que o serviço seja iniciado antes de iniciar o serviço". Para isso, você precisa das opções "Requer" e "Depois" no seu arquivo b.service:
[Unit]
Requires=a.service
After=a.service
[Service]
ExecStart=/bin/sleep 1000
= UPDATE =
OK, vejo o que está errado: no seu arquivo a.service, você coloca o comando ExecStart e não especificou o tipo. Isso significa que o Type será padronizado como 'Simple'. Você precisa do tipo 'Bifurcação' para que isso funcione. Na página do manual systemd.service:
If set to simple (the default if neither Type= nor BusName=, but ExecStart= are specified), it is expected that the process configured with ExecStart= is the main process of the service. In this mode, if the process offers functionality to other processes on the system, its communication channels should be installed before the daemon is started up (e.g. sockets set up by systemd, via socket activation), as systemd will immediately proceed starting follow-up units.
If set to forking, it is expected that the process configured with ExecStart= will call fork() as part of its start-up. The parent process is expected to exit when start-up is complete and all communication channels are set up. The child continues to run as the main daemon process. This is the behavior of traditional UNIX daemons. If this setting is used, it is recommended to also use the PIDFile= option, so that systemd can identify the main process of the daemon. systemd will proceed with starting follow-up units as soon as the parent process exits.
Portanto, você deve atualizar seu arquivo a.service para incluir 'Type = Forking':
[Service]
Type=forking
ExecStart=/bin/false
Isso funcionará. :)