Second part first,
String objects do store their content on the heap and growing strings will cause relocation and hence small hardly reusable fragments on the heap, so heavy use of them is the most common cause for this - and many people got rid of their problems by just substituting
Now for the cyan blinking, since when a cloud connection is set up, you'll need several objects to do the communication and these will need some buffers and other stuff which will probably be stored on the heap, but if there is not enough unfragmented space, these objects can't be constructed and since the system is dealing gracefully with allocation failures you won't see the typical SOS panic which would happen in a lot of less forgivingly written code.
But I'm not saying this is the cause for the issue you're seeing, but it might be one that you might not think of but easily could cure.
BTW, flashing cyan is not considered freezing firmware. A steady RGB LED would indicate frozen system.
You can also use
SYSTEM_THREAD(ENABLED) to keep your own code in control whether or not the system can connect.
As you said, this was 2014 and on a Spark Core - many things have changed since (providing you've also gone with the regular system updates)