Votre sous-requête n'est pas corrélée du tout. L'identifiant "TableA.key" dans la sous-requête fait référence à la TableA dans la clause FROM de la sous-requête, et non à la table cible de la mise à jour (qui se trouve également être la TableA). Vous ne souhaitez pas mettre à jour TableA.field avec le jeu de résultats d'une jointure à deux tables. Vous voulez simplement ceci :
UPDATE TableA
SET TableA.field = (SELECT TableB.field
FROM TableB
WHERE TableA.key = TableB.key)