Parece que a diferença tem a ver com o cabeçalho Content-Length e como ele é tratado pelos dois comandos.
Mas antes de entrar nisso, curl -X HEAD não fornece nenhuma saída porque, por padrão, curl não imprime cabeçalhos se a opção -i não for fornecida (não necessária em -I ).
Em qualquer caso, curl -I é a maneira correta de buscar os cabeçalhos. É só pedir o cabeçalho e fechar a conexão.
Por outro lado, curl -X HEAD -i aguardará a transmissão do número de bytes declarado por Content-Length . No caso de não Content-Length não ser especificado, eu acho que ele irá esperar por alguns dados ou por aquele cabeçalho em particular.
Alguns exemplos que mostram esse comportamento:
$ curl -X HEAD -i http://www.elpais.es
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: http://www.elpais.com/
Date: Wed, 12 May 2010 06:35:57 GMT
Connection: keep-alive
Porque Content-Length é 0, neste caso ambos os comandos se comportam da mesma forma. E a conexão é fechada depois.
$ curl -X HEAD -i http://slashdot.org
HTTP/1.1 200 OK
Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005001296
X-Bender: Since I love you all so much, I'd like to give everyone hugs.
X-XRDS-Location: http://slashdot.org/slashdot.xrds
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=iso-8859-1
Content-Length: 115224
Date: Wed, 12 May 2010 06:37:20 GMT
X-Varnish: 1649060825 1649060810
Age: 1
Connection: keep-alive
curl: (18) transfer closed with 115224 bytes remaining to read
Nesse caso, parece haver um tempo limite (provavelmente por Varnish), então curl protesta que a conexão foi fechada antes de ter recebido o número de bytes Content-Length .
A propósito, olhe para os cabeçalhos engraçados X-Bender (mostrado no exemplo) e X-Fry (teste você mesmo):).