So the assignment of b is faster because it doesn't have to copy data, unlike the assignment of a?
No. There is no difference in regards to copying.
What you are doing is binding a reference to a temporary object. The lifetime of the temporary object is in this particular case extended beyond the full expression to match the lifetime of the reference. The behaviour of the program is effectually the same as if you had not used a reference. Using the reference here has the downside that programmers may be confused by its meaning unless they are aware of this lifetime extension rule.
There is no reason to use a reference like this when you know that the function does not return a reference. If the function did return a reference, then you would avoid copying by using a reference. Whether copying is faster or slower than indirection through a reference depends on the type.
A case where lifetime extension is useful is within a template where you don't know whether a function returns a reference or a reference wrapper (which is an object i.e. not a reference, but behaves like a reference in some regards due to overloaded operators). The temporary lifetime extension allows both cases to behave the same way.