Eu teria pensado que a ordem era a chave aqui, que o apache serviria o primeiro servername correspondente, mas fiz um teste rápido, e esse não parece ser o caso. Ele sempre parece corresponder ao curinga, não importa em que ordem eles estão.
O melhor que eu poderia pensar com um endereço IP é praticamente o que Evgeny sugeriu, ter um virtualhost e usar um redirecionamento de proxy para books.domain.
<VirtualHost *>
ServerName domain.com
ServerAlias domain.info domain.net domain.org *.domain.com *.domain.info *.domain.net *.domain.org
DocumentRoot /home/domain.com/public_html/
<Directory /home/domain.com/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /home/domain.com/logs/error.log
CustomLog /home/domain.com/logs/access.log combine
ServerSignature Off
<Directory /home/media/books>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
Alias /home/media/books /books
RewriteRule ^books\.domain\.com(.*)$ http://domain.com/books$1 [NC,P,L]
RewriteRule ^ebooks\.domain\.com(.*)$ http://domain.com/books$1 [NC,P,L]
</VirtualHost>
A única maneira em que posso pensar para preservar os curingas e os vhosts separados seria se você tivesse dois endereços IP e atribuísse os dois virtualhosts para separar endereços. Eu ainda sinto que deve haver uma maneira melhor de fazer isso, porém, estará interessado nas outras soluções.