JSON_VALUE is a function that converts a scalar value in the JSON to a SQL scalar value. This is why the expression with $.a works - the associated value (100) is a scalar (number) value.
On the other hand the path expression $.c selects a complex value, namely the array [{xico:1}]. Complex value can be returned with the JSON_QUERY function.
SELECT JSON_QUERY('[{a:100}, {b:200}, {c:[{xico:1}]}]', '$.c') AS value FROM DUAL;
[{"xico" : 1}]
The JSON_QUERY function also allows to select scalar values and return them wrapped in an array if you use the WITH WRAPPER clause.
SELECT JSON_QUERY('[{a:100}, {b:200}, {c:[{xico:1}]}]', '$.a' with wrapper) AS value FROM DUAL;
[100]
By the way: NULL is returned by default if an error is encountered when evaluating the path expression. You can change this default by supplying the ERROR ON ERROR clause:
SELECT JSON_VALUE('[{a:100}, {b:200}, {c:[{xico:1}]}]', '$.c' ERROR ON ERROR) FROM DUAL;
ORA-40456: JSON_VALUE evaluated to non-scalar value
or
SELECT JSON_QUERY('[{a:100}, {b:200}, {c:[{xico:1}]}]', '$.a' ERROR ON ERROR) FROM DUAL;
ORA-40480: result cannot be returned without array wrapper