Splitting a Serial.readString into string array
Your main problem is this:

char buf[vst.length()+1];


You can't initialize an array with the return value of a function.

Instead you would need to use alloca to perform the same function:

char *buf = alloca(vst.length()+1);


However, the way you're doing it is wasteful. You don't need buf at all.  You can directly access and manipulate the internal char buffer inside the string using vst.c_str();.

For convenience you can point buf at it:

char *buf = vst.c_str();


To complete the picture here's a routine that takes the string and gives you three integers. Since we expect a specific format with only 3 sections to it we don't really need a loop.

// Use readStringUntil to avoid the 1 second delay.
String vst = Serial.readStringUntil('\n');
char *buf = vst.c_str();

char *hourString = strtok(buf, ":");
char *minuteString = strtok(NULL, ":");
char *secondString = strtok(NULL, ":");

if (secondString != NULL) { // Will only be true if we have two colons
    int hours = atoi(hourString);
    int minutes = atoi(minuteString);
    int seconds = atoi(secondString);

    Serial.print("It is ");
    Serial.print(minutes);
    Serial.print(" and ");
    Serial.print(seconds);
    Serial.print(" seconds past ");
    Serial.println(hours);
} else {
    Serial.println("Invalid time format");
}