These do slightly different things. And in fact the last one echo ${x-1} doesn't in fact set x.
x=1 sets x unconditionally.
As for the := operator. This is from the ksh manual:
${parameter:=word}
If parameter is not set or is null then set it to word; the
value of the parameter is then substituted. Positional parameters may
not be assigned to in this way.
And if you look at the family of x= operators there are many more, :- being the most popular that I have run across. That one initializes substitutes a variable to a default value if the variable hasn't been set. (The distinction between substitute and assign is a little hazy in my mind.) In Ruby, this is ||=.
I think David Korn will admit that the variety of operators was probably overkill, but it is now part of the POSIX standard, Section 2.6.2 so it is probably there to stay.
Even programming languages do not have more than one.
As alluded to above, there's a misconception that these are exactly the same. It is not uncommon in programming languages to have variations of the assignment statement. I mentioned ||= in Ruby. Many languages have +=, -= and so on. In Perl if you run $x += 1 that will set $x to 1 if $x hasn't been defined before (and, shame on you, you don't have "strict" checking).