Vous ne pouvez pas le faire car SQL est compilé avant de savoir quelle est la valeur de @a (je suppose qu'en réalité, vous voudriez que @a soit un paramètre et non codé en dur comme dans votre exemple).
À la place, vous pouvez faire ceci :
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
Mais attention, il s'agit d'une faille de sécurité (attaques par injection SQL) donc ne devrait pas être fait si vous ne pouvez pas faire confiance ou bien nettoyer @a.