Your examples are little bit messy.
The first example is wrong - probably incorrect use of IN keyword, and quote_literal() is absolutely useless in this context. The second one is probably wrong too - if val1 is a variable. plpgsql variables are not visible inside the SQL string in an EXECUTE statement. Next issue is INTO in the SQL string.
postgres=# do $$
DECLARE rc int;
val1 varchar := 'Hello';
BEGIN
rc := (SELECT count(*) FROM xxx WHERE xxx.v = val1);
RAISE NOTICE '%', rc;
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = $1'
USING val1 INTO rc;
RAISE NOTICE '%', rc;
END;
$$;
NOTICE: 1
NOTICE: 1
DO
quote_literal() is usually necessary for dynamic SQL, when you cannot use a USING clause. In your example:
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = ' || quote_literal(val1)
INTO ...
It protects against SQL injection and ensures proper escaping.
Modern releases have the format() function:
EXECUTE format('SELECT count(*) FROM xxx WHERE xxx.v = %L', val1) INTO ...
But EXECUTE ... USING should be preferred.