Eu nunca vi vários
<VirtualHost *:80>
entradas antes, e ficaria muito surpreso se isso realmente separasse o tráfego. Além disso, definir um serverAlias igual ao servername é definitivamente redundante. E o seu exemplo não mostra a configuração serverRoot (esperamos que seja diferente do documentRoot ou você terá grandes problemas). Experimente:
NameVirtualHost *:80
<VirtualHost dev.a.local>
DocumentRoot "D:/wwwroot/a/public"
ErrorLog "logs/a.log"
CustomLog "logs/a-access.log" common
<Directory "D:/wwwroot/a/public">
Options Indexes FollowSymLinks
AllowOverride All
# Controls who can get stuff from this server.
Order allow,deny
Allow from all
DirectoryIndex index.php
</Directory>
</VirtualHost>
<VirtualHost dev.b.local>
DocumentRoot "D:/wwwroot/b/public"
ErrorLog "logs/b.log"
CustomLog "logs/b-access.log" common
<Directory "D:/wwwroot/b/public">
Options Indexes FollowSymLinks
AllowOverride All
# Controls who can get stuff from this server.
Order allow,deny
Allow from all
DirectoryIndex index.php
</Directory>
</VirtualHost>