Why doesn't the $1 syntax work for all queries?
Yes, you cannot use parameters with COPY.
Why? Because nobody has implemented it. Feel free to come up with a patch.
Currently only SELECT, INSERT, UPDATE and DELETE support parameters.
You can use the format function with the %L format to comfortably construct an SQL string with a string literal while avoiding the danger of SQL injection.