Unfortunately, there's isn't a way to programatically change the CRON string for a channel.
However, you could set up a custom script to run on a particular schedule (say, once a day) which made an API call using qie.callRESTWebService() for the current moon phase and, if it matched the specific criteria desired, use qie.addInboundMessage() to submit the message at the right time.
Also note that you can add multiple CRON strings to a source node, so if you already know the dates/times of the full moon, you can add them in this format:
0 0 18 * * MON-FRI | 0 0 12 * * SAT,SUN
However, this would not address the second full moon issue. The best way to handle that is with a custom script.