The problem is that this is not a valid SQL statement.
You can access the columns in new with dynamic SQL like this:
EXECUTE 'SELECT $1.id' INTO v_id USING NEW;
There is no comfortable way like that for changing individual columns in NEW.
You could use TG_RELID to get the OID of the table, query pg_attribute for the columns, compose a row literal string composed of the values in NEW and your new value, cast this to the table type and assign the result to NEW. Quite cumbersome.
Here is sample code that does that (I tested it, but there may be bugs left):
CREATE OR REPLACE FUNCTION dyntrig() RETURNS trigger
   LANGUAGE plpgsql AS
$$DECLARE
   colname text;
   colval text;
   newrow text := '';
   fieldsep text := 'ROW(';
BEGIN
   /* loop through the columns of the table */
   FOR colname IN
      SELECT attname
      FROM pg_catalog.pg_attribute
      WHERE attrelid = TG_RELID
        AND attnum > 0
        AND NOT attisdropped
      ORDER BY attnum
   LOOP
      IF colname = 'name' THEN
         colval = '2222';
      ELSE
         /* all other columns than 'name' retain their value */
         EXECUTE 'SELECT CAST($1.' || quote_ident(colname) || ' AS text)'
            INTO colval USING NEW;
      END IF;
      /* compose a string that represents the new table row */
      IF colval IS NULL THEN
         newrow := newrow || fieldsep || 'NULL';
      ELSE
         newrow := newrow || fieldsep || '''' || colval || '''';
      END IF;
      fieldsep := ',';
   END LOOP;
   newrow := newrow || ')';
   /* assign the new table row to NEW */
   EXECUTE 'SELECT (CAST(' || newrow || ' AS '
           || quote_ident(TG_TABLE_SCHEMA) || '.' || quote_ident(TG_TABLE_NAME)
           || ')).*'
      INTO NEW;
   RETURN NEW;
END;$$;