Andrei está certo - é nulo porque quando executado sob a estrutura ASP.NET MVC, o HttpContext (e, portanto, HttpContext.Session) não é definido quando a classe do controlador é construída como você poderia esperar, mas é definido ("injetado") mais tarde pela classe ControllerBuilder. Se você quiser um melhor entendimento do ciclo de vida, você pode puxar para baixo o framework ASP.NET MVC (o código-fonte está disponível) ou consultar: esta página
Se você precisar acessar a Sessão, uma forma seria sobrescrever o método "OnActionExecuting" e acessá-lo lá, pois ele estará disponível nessa hora.
No entanto, como Andrei está sugerindo, se seu código é dependente da Sessão, então pode ser potencialmente difícil escrever testes de unidade, então talvez você possa considerar envolver a Sessão em uma classe auxiliar que pode ser trocada por uma classe diferente, não versão web quando executado em testes de unidade, portanto, desacoplando seu controlador da web.