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を信頼できない、または十分にクリーンアップできない場合は、実行しないでください。