The reason you can't write to /etc/rc.local is found in the
mount command's output (truncated here).
/dev/mmcblk0p4 on /writable type ext4 (rw,relatime,data=ordered)
/dev/loop0 on / type squashfs (ro,relatime)
Ubuntu Core mounts the root filesystem as squashfs which is read-only. Parts of the filesystem are mounted as rw as you'll see in non-truncated output of the
mount command, however rc.local doesn't live on one of these.
HOW TO GET AROUND THE PROBLEM:
Firstly, rc.local is a legacy sysvinit file which has been supplanted by SystemD which is now default in Ubuntu and every other distro.
So you can't execute a script by calling it from rc.local because it's ro. A better- and more granular way of raising services on boot- is to use a SystemD Timer. This has the advantage of raising services relative to other services. It's a scalpel vs sysvinit's rc.local machete.
To execute the script at a precise point in the boot use a SystemD Timer. A specimen script is shown below; tweak to your specific use-case
cat <<EOF> /etc/systemd/system/myscript.service
chmod 644 /etc/systemd/system/myscript.service
systemctl enable myscript.service
This has been tested and proven to raise the custom service I created at the desired point in the boot and survives a reboot. HTH-