Inside your loop, you're doing let a = … and let b = … instead of a = … and b = …. When you use let, you're creating a new variable, but this new variable only exists for that particular invocation of the loop. If you remove the let in front of a and b in the loop, your program will work correctly.
As @john01dav said before, the let a =b; inside your loop creates a new variable a and shadows (i.e., hides) the previous variable a. These two variables are not connected to each other. The inner variable a is dropped at the end of the scope in which it is introduced, and let c = a + b; always looks up the outer variable a.
In other words, your code is equivalent to:
fn main() {
let a = 0;
let b = 1;
println!("{}", a);
println!("{}", b);
loop {
let c = a + b;
let d = b;
let e = c;
println!("{}", c);
// d and e are dropped here
}
}