You could do something like the following, but please take into account several things:
If you use readStringUntil(), it will wait until it receives the caracter or timeouts. Thus, with your current string, the last position will last a little longer, as it as to wait. You can add a trailing & to avoid this timout. You can easily check this behavior in your monitor, try to send the string with and without the extra & and you will see such timeout delay.
You actually do not need the servo index, you can just send your string of positions, and get the servo index by the value position in the string, something like: "90&80&180&". If you use the servo index, maybe you want to check it (convert to Int, and then match the loop index i) to ensure that nothing went wrong with your message.
You have to check that the returning string from readStringUntil is not empty. If the function timeouts, you didnt receive enough data, and thus any attempt to extract your Int values will produce strange results.
void setup() {
Serial.begin(9600);
}
void loop() {
for(int i=1;i<=3;i++){
String servo = Serial.readStringUntil(':');
if(servo!=""){
//here you could check the servo number
String pos = Serial.readStringUntil('&');
int int_pos=pos.toInt();
Serial.println("Pos");
Serial.println(int_pos);
}
}
}