You can specify the varchar2 length in the returning clause if you want:
with rws as (
select '{"attr":"valuuuuuuuuue"}' j
from dual
)
select json_value(j, '$.attr' returning varchar2(10)) too_short,
json_value(j, '$.attr' returning varchar2(20)) long_enough
from rws;
TOO_SHORT LONG_ENOUGH
<null> valuuuuuuuuue
Notice too_short is null because of the default "null on error" clause.