How to fix memory-leak code in ESP8266/NodeMCU caused by string concenation?
To write code that will not cause memory leak, you need to understand of where and what caused the memory leak first. The memory leak in this particular case is caused by the line
serial_data_read.concat(character); 

When you instantiate a String object with String serial_data_read = &quot;&quot;, Arduino String class create a memory allocation using dynamic memory allocation in the heap, and since your initialised it with &quot;&quot;, it therefore create a minimum size of allocation. This is all good if you know how to the dynamic memory is created and how it going to be used.
The problem started when you start doing String concatenation with the line serial_data_read.concat(character), the original allocation for your global variable serial_data_read is no longer have enough space for the concatenated variable, so it create a temporary variable in the heap and do the concatenation, and then eventually put the result back to this newly allocated memory for serial_data_read on the heap, leaving a hole at the heap for the original serial_data_read variable (and the temp variable).
What make this worst is that this is happening for each iteration every 16 iterations(see Edgar Bonet's comment below) of the while loop. Theoretically the old serial_data_read prior the concatenation should be free-up at some point (e.g. if your while loop is within a function, the part of the heap might be free-up at the exit of the function), it however does not necessary be the case because your newly created serial_data_read stay on top of piles of to-be-free-up memory that blocking the free up(think of a piece of cheese with a lot of holes on it), so the heap memory get less and less at each iteration.
Short term fix - do not do String concatenation in a loop
String class is not always evil if you know what's going on and how to use it. One of the quick fix for your problem is simply do not do String concatenation within a loop. And if you are using it within a function, keep it local. This will minimise the heap fragmentation.
if ((last_weight_time &lt; millis() - 1000)) {
   last_weight_time = millis();
   if (Serial.available() &gt; 0) {
      String serial_data_read = Serial.readStringUntil('\n');
   }
}

BTW, you can add ESP.getFreeHeap() in your loop() to check if there is still memory leak.
Long term fix - Don't use String class
For a better fix, and especially for some one new to the programming or C/C++, do not use String class and learn how to use c string and array. Here is the version without using String class.
length = 80;
char buffer[length] = {0};
if ((last_weight_time &lt; millis() - 1000)) {
   last_weight_time = millis();
   while(Serial.available()) {
      Serial.readBytesUntil('\n', buffer, length);
   }
}

Other resources to learn about
https://www.cplusplus.com/reference/cstring/ all the functions for c string and array manipulation to replace Arduino String class.
https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/