Neither of your options:
select *
from   A
       left outer join B on B.ID = A.ID1
       left outer join C on C.ID = A.ID2 AND B.xxx = C.yyy
Would be written as:
SELECT *
FROM a, b, c
WHERE b.id (+) = a.id1
AND   b.xxx = c.yyy (+)
AND   c.id (+) = a.id2
and:
select *
from   A
       left outer join C on C.ID = A.ID2
       left outer join B on B.ID = A.ID1 AND B.xxx = C.yyy
Would be written as:
SELECT *
FROM a, b, c
WHERE b.id (+) = a.id1
AND   b.xxx (+) = c.yyy
AND   c.id (+) = a.id2
What you have is:
SELECT *
FROM   a
       INNER JOIN b ON (a.id1 = b.id)
       INNER JOIN c ON (a.id2 = c.id AND b.xxx = c.yyy)
why?
SELECT *
FROM   a, b, c
WHERE  b.id (+) = a.id1
AND    b.xxx = c.yyy
AND    c.id (+) = a.id2
The line:
AND    b.xxx = c.yyy
Requires that there is a b and a c row; this will not occur when there is a left-outer join so the join is the equivalent of an inner join and the query could be rewritten as:
SELECT *
FROM   a, b, c
WHERE  b.id = a.id1
AND    b.xxx = c.yyy
AND    c.id = a.id2
And all then it is clearer that all the joins are inner joins.
What you may have intended to write was:
select *
from   A,
       (
         SELECT b.id AS b_id,
                c.id AS c_id,
                b.xxx,
                c.yyy
         FROM   b, c
         WHERE  b.xxx = c.yyy
       ) bc
WHERE  bc.b_id (+) = a.id1
AND    bc.c_id (+) = a.id2
Which would be:
select *
from   A
       left outer join (
         SELECT b.id AS b_id,
                c.id AS c_id,
                b.xxx,
                c.yyy
         FROM   b
                INNER JOIN c ON b.xxx = c.yyy
       ) bc
       on bc.b_id = a.id1 AND bc.c_id = a.id2
or, using parentheses in the join to set the precedence of the joins:
SELECT *
FROM   a
       LEFT OUTER JOIN (
         b
         INNER JOIN c
         ON b.xxx = c.yyy
       )
       ON b.id = a.id1 AND c.id = a.id2
db<>fiddle here