Не можете да го направите, защото 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.