The loop for i in "1:2:3"; do ... runs just once. There's no word splitting of static literal strings, only expansions, and even then only unquoted expansions. You'd see different results with e.g.
IFS=:
var="1:2:3"
for i in $var; do...
The rest is just how echo and printf work. echo joins the arguments with spaces, and prints the joined string followed by a single newline. But printf repeats the format string as many times as necessary to accommodate all arguments, so you get multiple newlines.
So, in the first one, echo $i runs with i set to 1:2:3. The expansion is unquoted, so it's split, and echo get the three arguments 1, 2, 3. JoinedIt joins them with spaces, they'regiving 1 2 3, and the output is that plus the newline. That's the same as running echo 1 2 3. (Or even echo 1 2 "3", since the number of unquoted spaces on the shell command line doesn't matter.)
The third one is similarly the same as printf "%s\n" 1 2 3, and with the format string repeated, the output is on three lines. Something like printf "%s %s\n" 1 2 3 would use two arguments per repetition, and would print 1 2 on one line, and 3 on another.