For question 1: Add an infinite loop in the method that receives data:
while (true) { your code here }
This will keep it always running and it will continue to receive messages. It will not block your main program because you are running it in a separate thread. And it will be terminated automatically when you close your program because you set the Thread to IsBackground=true.
However, note that there is something that may give you trouble: This appears to be a Winforms Application given that you have a Form_Load. This type of application does not allow accessing the screen from a different thread, but you are using a messagebox in your Thread. To do this correctly, you need to marshall execution to the main thread before displaying the message box. Look up in the documentation "Control.Invoke". The Invoke method of any control (including the Form itself) allows you to bring execution momentarily to the main thread.
For question 2: You can allocate a large buffer if you wish. It will not slow down anything, but it will allocate a large amount of memory to your program. If you are not using all the memory, the operating system will swap out to disk any parts that are not currently in use, if the system starts running low on memory.
However, there is a better way, although it takes more programming effort. When you call client.Receive, you pass the Length of the buffer to the Receive method, and the method returns the number of bytes that it actually read. If it tells you that it read less bytes than the buffer size, you are done. But if it tells you that it used the whole buffer, there might be more bytes incoming. In this case, you repeat in a loop and call Receive again to get the next buffer-load of characters. Repeat until the number received is less than the size of the buffer. In this way, you can receive a long message split into small pieces, each of them equal to the buffer length.
A warning about this: If you are truly using UTF8, as appears to be the case from your call to UTF8.GetString, be aware that some characters occupy more than one byte when encoded in UTF8. If you are receiving your message split into pieces, make sure that you don´t try to do the GetString on one of the individual pieces, because this will fail if one of the multibyte characters happens to be split in between two buffers.