Should I always specify an IP address, or is it OK to use *?
Você pode especificar * em ambas as diretivas.
NameVirtualHost *
<VirtualHost *> ...
Why is VirtualHost a block and NameVirtualHost a directive?
NameVirtualHost define apenas o IP no qual você usará hosts virtuais de nome. Não contém outras diretivas, então não há razão para que ele seja bloqueado. Por outro lado, o VirtualHost contém outras diretivas para um host virtual específico, portanto, ele deve ser um bloco.
Why do I need NameVirtualHost for IP-based virtual hosts?
Você não precisa disso. Veja o exemplo .
Leitura recomendada: documentação do Host Virtual Apache