These APIs are designed to leverage the SIMD registers and instruction sets of your CPU, which are vector registers (each one holds four floats). Getting data into and out of these registers is sometimes "slow" (relatively speaking): the best way to utilize them is usually to get data into them and then keep it there as long as possible while you operate on it.
If the dot product operation were to return a single float instead, it would need to pay that transfer cost every time you called it, even if you're just going to immediately transfer that result back into another SIMD register to perform more operations on it. So it's less pessimistic on the part of the API to assume you'll keep doing more SIMD math and thus give you a result that still facilitates that. That puts the decision about when to pay the transfer cost in your hands instead of theirs, and you presumably know better than they do about when the best time to eat that transfer cost is for your application.
Further, by replicating the results out to every component of the vector, you can perform further multiplications against that return in parallel with further SIMD operations.