That obviously is a very simple file structure, thus it has it's limitations. You will probably won't notice any performance problems until you have more than tens of thousands of lines. As said in the comments you're gonna need a better tool after that.
If you keep using this method, you don't really need to load everything, and save it back on the disk after updating the values.
You can stream reading the file and write back to a temp file at the same time. Once you come across to the group you need to update, you need to update the Balance value of course. After you're done with updating you can delete the old file and rename the temp file with your actual file.
with open('input.txt') as original, open('output.txt', 'w') as target:
while True:
label1 = original.readline()
pin = original.readline()
label2 = original.readline()
balance = original.readline()
if pin.strip('\n') == 'PIN':
balance = 'new-balance\n'
target.writelines([label1, pin, label2, balance])
if not balance:
break
# Delete original and rename new file.