Você quase teve. A solução completa é:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/preview
RewriteCond %{QUERY_STRING} !^/preview
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
O motivo pelo qual ele falhou foi que http://test.domain.com/preview/blah/blah
primeiro foi resolvido para http://test.domain.com/index.php?/preview/blah/blah
e que essa URL foi imediatamente reconfigurada novamente (o htaccess faz um loop com o novo URL).
O novo URL ( http://test.domain.com/index.php?/preview/blah/blah
não corresponde às suas condições, porque a parte depois do? não é considerada parte do REQUEST_URI, mas do QUERY_STRING. Consulte a descrição do REQUEST_URI em link