I've found out that for my application is better to put the possibilities between parentheses to separate then from the parts of the string that don't need to be touched
let initialString = "single result:\n(foo|bar|anything|something)"
let endString
let stringChangeInterval = setInterval(() => {
    let validatedPairs = []
    for(let i = 0; i < initialString.length; i++){
        if(initialString[i] != "(") continue
        for(let j = i+1; j < initialString.length; j++){
            if(initialString[j] != ")") continue
            validatedPairs.push([i, j])
            i = j
            break
        }
    }
    endString = initialString
    for(let i = validatedPairs.length-1; i >= 0; i--){
        let possibilities =  initialString.substring(validatedPairs[i][0]+1, validatedPairs[i][1]).split('|')
        if(possibilities.length ===  1) continue
        let choosenPossibilty = randomFromArray(possibilities)
        endString = endString.replace(endString.substring(validatedPairs[i][0], validatedPairs[i][1]+1), choosenPossibilty)
    }
    console.log(endString)
}, 1000);
function randomFromArray(array){
    return array[Math.floor(Math.random() * array.length)]
}
EDIT:
The code above works fine if there is no repeated possibilities, otherwise the code will have a complete misbehavior, so I've made some adjustment to the code:
let initialString = "single result:\n(foo|bar|anything|something)"
let endString
let stringChangeInterval = setInterval(() => {
    let validatedPairs = []
    for(let i = 0; i < initialString.length; i++){
        if(initialString[i] != "(") continue
        for(let j = i+1; j < initialString.length; j++){
            if(initialString[j] != ")") continue
            validatedPairs.push([i, j])
            i = j
            break
        }
    }
    endString = initialString
    for(let i = validatedPairs.length-1; i >= 0; i--){
        let possibilities =  initialString.substring(validatedPairs[i][0]+1, validatedPairs[i][1]).split('|')
        if(possibilities.length ===  1) continue
        let choosenPossibilty = randomFromArray(possibilities)
        let lastIndex = endString.lastIndexOf(endString.substring(validatedPairs[i][0], validatedPairs[i][1]+1))
        endString = endString.substring(0, lastIndex)+choosenPossibilty+endString.substring(lastIndex + validatedPairs[i][1]+1 - validatedPairs[i][0])
    }
    console.log(endString)
}, 1000);
function randomFromArray(array){
    return array[Math.floor(Math.random() * array.length)]
}