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.