[Galaxy S I9000 Android Development] RyanZA:
Okay, so this method DOES appear to work! I had some time this afternoon, so I put the following together in java:

public final static String[] ReplaceCommands = new String[]{"pvrsrvinit", "servicemanager", "vold", "notified_event", "netd", "debuggerd", "rild", "drexe",
"npsmobex", "gpsd/glgps_samsungJupiter", "app_process", "mediaserver", "killmediaserver", "wpa_supplicant", "dhcpcd", "mfgloader", "wlservice", "dbus-daemon", "logwrapper",
"sdptool", "installd", "sensorserver_yamaha", "mtpd", "keystore", "immvibed", "tvoutserver", "dumpstate",};

vt.runCommand("mount -o remount,rw rootfs /");
vt.runCommand("mount -o remount,rw /dev/block/stl9 /system");
vt.busybox("mkdir /dbdata/logs");
vt.busybox("mkdir /dbdata/logs/gpsd");
vt.busybox("chmod 777 /system/bin");
vt.busybox("chmod 777 /system/bin/gpsd");

for (String command : ReplaceCommands) {
vt.busybox("mv /system/bin/"+command+" /system/bin/"+command+".replace");
FileOutputStream fos = new FileOutputStream("/system/bin/"+command);
OutputStreamWriter writer = new OutputStreamWriter(fos);
writer.write("#!/system/bin/sh\n");
writer.write("echo \"called\" > /dbdata/logs/"+command+"\n");
writer.write("sleep 2\n");
writer.write("echo \"starting "+command+".replace $@\n"+"\" > /dbdata/logs/"+command+"\n");
writer.write(command+".replace $@\n");
writer.close();
fos.flush();
fos.close();

vt.busybox("chmod 755 /system/bin/"+command);
}

vt.busybox("mv /system/bin/playlogos1 /system/bin/playlogos1.replace");
FileOutputStream fos = new FileOutputStream("/system/bin/playlogos1");
OutputStreamWriter writer = new OutputStreamWriter(fos);
writer.write("#!/system/bin/sh\n");
writer.write("echo \"test 1\" > /dbdata/log\n");
writer.write("umount /data 2>>/dbdata/log\n");
writer.write("mount >> /dbdata/log\n");
writer.write("mount -t rfs -o nosuid,nodev,check=no /dev/block/mmcblk0p2 /data 2>>/dbdata/log\n");
writer.write("echo \"test 2\" >> /dbdata/log\n");
writer.write("playlogos1.replace\n");
writer.close();
fos.flush();
fos.close();

vt.busybox("chmod 755 /system/bin/playlogos1");

The result in /dbdata/log is

# cat /dbdata/log
cat /dbdata/log
test 1
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
/dev/block/stl6 /mnt/.lfs j4fs rw,relatime 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/stl9 /system rfs rw,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=
utf8 0 0
/dev/block/stl10 /dbdata rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/
rwx,iocharset=utf8 0 0
/dev/block/stl11 /cache rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/r
wx,iocharset=utf8 0 0
/dev/block/stl3 /efs rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,
iocharset=utf8 0 0
test 2

It replaces all the startup services, besides for immvibed (which is the dalvik service I believe) with scripts that sleep for 2 seconds, and then starts the real service. This gives us 2 seconds to quickly unmount /data and do whatever we need! :D And as you can see from the log, it works perfectly, with /data being unmounted and then remounted without issue on JPH.

I see zero reason why this can't be turned into a full system where we can swap out RFS for EXT2. So, good news so far. :)