An interesting characteristic of character/byte stuffing, is that the size of a frame is dependent on the data that is being sent in the payload of the frame. It is in fact not possible to make all frames exactly the same size, given that the data that might be carried in any frame is arbitrary.
That isn't actually true. Some protocols (like ATM) use fixed frame (cell) sizes and stuff unused portions. Other protocols (like Ethernet) use variable frame sizes with minimum and maximum sizes - the minimum might require some stuffing as well for very small payloads.
The frame size is a property of the protocol - the need for stuffing is a result of that, not the other way around. Of course, it's possible to make all frames the same size. It might just not be practical or efficient. Since data is packetized anyway, oversized data chunks must be carried over to the next frame(s).
let's we want to transmit a 10MB of data, if we limit the size of the frame body to be sth like maximum 500 bytes, no matter how many times we do byte stuffing in each frame, the size of frame is always fixed, unless the book mean the "actual valid data", am I correct?
If you transmit 10 MB of data with a frame payload of 500 bytes you need 20,000 frames. You don't use stuffing when it's not required, it's wastes bandwidth. If your data doesn't fit neatly into a certain number of frames, the last one is either stuffed (for a fixed size) or it's just smaller than the maximum (for a variable size).
Fixed frame sizes have the problem of bad efficiency. Imagine a real-time application (like VoIP), where a frame might carry as little as 64 bytes payload. UDP over IPv4 over Ethernet does that with "just" 66 bytes overhead.
If you now had a fixed payload size of 500 bytes, the overhead would be 434 bytes larger - per frame.
Of course, you can tailor a protocol to your application, to use a smaller, fixed frame size - but then it would be inefficient for large payloads.
Variable frame sizes allow a protocol to adapt to a wide variety of applications, with different payload sizes. It can carry small payloads with a tolerable amount of overhead and large payloads with a very small overhead.