What you want is:
REGEXP_REPLACE (INPUTSTR, '^([^:]+ : )*', '')
Specifically, this seeks a string starting from the beginning (initial caret ^) with zero or more occurrences of a string with non-colons ([^:]+) followed by : . It replaces all of these leading strings terminated with the space-colon-space with an empty string.
The following query demonstrates how this works. I've used a factored subquery with your sample input and a half dozen other tests, and the query output has the input, my regexp_replace result, and your REPLACE (REGEXP_SUBSTR syntax (I replaced your ' abc : efg : xyz ' with the factored subquery). You can add another test case by duplicating the union all select line and changing the string for inputstr.
Oh, about doold -- your syntax couldn't handle an input string without a colon, it would throw an error that killed all query results. So I wrapped your syntax in a DECODE (doold to get all the rows back.
with sampl as (
select 'abc : efg : xyz' as inputstr, 1 as doold from dual
union all select 'z : b :' as inputstr, 1 as doold from dual
union all select 'z : b : ' as inputstr, 1 as doold from dual
union all select ' : a ' as inputstr, 1 as doold from dual
union all select ' a ' as inputstr, 0 as doold from dual
union all select '' as inputstr, 1 as doold from dual
union all select ' hij : klm : nop : qrs : tuv' as inputstr, 1 as doold from dual
)
SELECT
inputstr,
regexp_replace (inputstr, '^([^:]+ : )*', '') as bettr,
decode (doold,
1, -- the following is your original expression, for comparison
-- purposes, edited only to replace 'abc : efg : xyz' with inputstr
REPLACE (
REGEXP_SUBSTR (
inputstr,
':.*$',
REGEXP_INSTR (
inputstr,
':',
1,
LENGTH (inputstr)
- LENGTH (
REPLACE (inputstr,
':',
NULL))),
1),
': '),
'Sorry the syntax won''t support input "' || inputstr || '"'
) data_after_the_last_colon
FROM sampl
order by doold desc, length (inputstr)