A varchar2 (in 11g) has a ceiling of 4000 bytes. So you cannot return *more* than 4000 bytes as a varchar2.
You could return *multiple* varchar2 variables, eg
select
dbms_lob.substr(x, 4000, 1),
dbms_lob.substr(x, 4000, 4001),
dbms_lob.substr(x, 4000, 8001),
dbms_lob.substr(x, 4000, 12001)
...
from
...
but that is exactly why clobs are there - for strings *longer* than 4000.