If you include some random data in the salt, it's impossible to create rainbow tables out of it. Thus the attacker would have to bruteforce every single password, which will take its time (specially on bcrypt).
Salting doesn't make it impossible, it just takes longer time.
Exactly. Salting is a constant factor de-optimization of the password cracking process. If your users are choosing good passwords (i.e. precomputed table based attacks don't work) then you don't need it. If they aren't (and they aren't!) then salting at least gives you some hope that such an attack will be infeasible for a given attacker's hardware.
In practice, the constant factor can be very large, so this isn't a meaningless trick.
Salting doesn't make it impossible, it just takes longer time.