I implemented a colour class similar to the sfml one in one of my projects and I had the same considerations. I almost decided to go with floats, but I decided against it for these reasons:
When dealing with colours in other contexts aside from rendering, they are commonly represented using bytes. I.e. colour pickers in applications, data in image files, etc. This means that when interacting with other libraries for example when loading/saving images, they are going to be in bytes. This means that your code might integrate more easily when using bytes.
For example, if the bytes are stored like so:
struct Color
{
uint8_t r, g, b, a;
}
And an image loading function spits out a char* of bytes of RGBA data, you can simply do:
Color* color = (Color*) theImage;
And you can access the pixels directly due to binary compatibility.
Also by using bytes, there is no ambiguity. You know that if you have 223 red, you can directly compare it with the pixel of an external function. But if you store stuff in floats, maybe it would depend on arbitrary float maths if the values are exact or not. I am not sure how valid that case is, but for me it felt like a reason.
Finally, the conversions to float isn't a bottleneck in terms of performance in the very most of all cases.
Note: I don't know how much this applies to SFML's choice of using bytes, but that's my reasoning for a similar case. :)