Вы не можете сделать это, потому что SQL компилируется до того, как он узнает, каково значение @a (я предполагаю, что на самом деле вы бы хотели, чтобы @a был некоторым параметром, а не жестко закодированным, как в вашем примере).
Вместо этого вы можете сделать это:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
Но будьте осторожны, это уязвимость системы безопасности (атаки с использованием sql-инъекций), поэтому ее не следует делать, если вы не можете доверять или хорошо чиститесь @ a.