No puede hacerlo porque SQL se compila antes de saber cuál es el valor de @a (supongo que, en realidad, desea que @a sea un parámetro y no esté codificado como en su ejemplo).
En su lugar, puedes hacer esto:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
Pero tenga cuidado, esta es una vulnerabilidad de seguridad (ataques de inyección de sql), por lo que no debe hacerlo si no puede confiar o limpiar bien @a.