Hay un par de problemas con su enfoque. En primer lugar, no puede usar su argumento valor para hacer referencia a la columna subyacente. Lo bueno es que puedes usar Declaraciones preparadas como solución para esto.
El segundo problema es que las funciones de MySQL no permiten el uso de declaraciones preparadas. Para solucionar esa limitación, debe usar Procedimientos almacenados en su lugar. Como ejemplo:
CREATE PROCEDURE test_func (IN col1 varchar(100), OUT res int)
BEGIN
SET @s=CONCAT('SELECT ',col1,' INTO @res FROM yourtable WHERE id=1');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SELECT @res INTO res;
END