Для прохождения проверки SPF отправляющий IP-адрес должен пройти хотя бы один из механизмов. Механизмы включения проверяют входящий IP-адрес, используя включенную запись SPF, и «возвращают» результат.
Используя ваш пример:
a.example.com    IN TXT "v=spf1 include:b.example.com +all"
b.example.com    IN TXT "v=spf1 -all"
Включенная запись вернет ошибку, так как она содержит только механизм -all . Однако первая запись пройдет, потому что она имеет механизм +all .
Используя более подробный пример:
a.example.com            IN TXT "v=spf1 ip4:1.2.3.4 mx include:spf.example.org -all"
a.example.com            IN MX  0 mailserver.example.com
mailserver.example.com   IN A   1.2.3.5
spf.example.org          IN TXT "v=spf1 ip4:4.3.0.0/16 -all"
Я запишу результаты каждого механизма в том же порядке, в котором они указаны в записи. Итак, результаты будут отформатированы так:
- a.example.com: 
[ip4] [mx] [include] [-all] 
- spf.example.org: 
[ip4] [-all] 
Со следующими адресами отправителя:
1.2.3.4  
- spf.example.org -> 
fail fail 
- a.example.com -> 
pass fail fail fail 
Окончательный результат будет pass так как по крайней мере один чек прошел
1.2.3.5
- spf.example.org -> 
fail fail 
- a.example.com -> 
fail pass fail fail 
Окончательный результат будет pass так как по крайней мере один чек прошел
4.3.10.20
- spf.example.org -> 
pass fail 
- a.example.com -> 
fail fail pass fail 
Окончательный результат будет pass так как по крайней мере один чек прошел
TL; DR: механизм включения оценивается отдельно, а результат возвращается к оценке записи, которая его включила. Оценка записи не выполняется, если не найдено ни одного механизма. Поскольку вы завершили свой пример с помощью +all , он всегда будет совпадать и поэтому пройдет.