Non puoi farlo perché SQL viene compilato prima che sappia qual è il valore di @a (suppongo che in realtà vorresti che @a fosse un parametro e non codificato come nel tuo esempio).
Invece puoi farlo:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
Ma attenzione, questa è una vulnerabilità di sicurezza (attacchi sql-injection), quindi non dovrebbe essere fatto se non puoi fidarti o pulire bene @a.