If you want to build an ordered fact piecemeal, I'd recommend using a StringBuilder rather than using functions that aren't part of the documented CLIPS API:
Fact *rv;
StringBuilder *sb = CreateStringBuilder(env,256);
SBAppend(sb,"(");
SBAppend(sb,"my_fact");
SBAppend(sb," ");
SBAppend(sb,"nil");
SBAppend(sb," ");
SBAppend(sb,"asdf");
SBAppend(sb," ");
SBAppend(sb,"hjkl");
SBAppend(sb,")");
rv = AssertString(env,sb->contents);
SBDispose(sb);
In your original code, you're calling MBCreate to create the multifield for storing the fact's data, but this creates a structure that's managed by the periodic garbage collector. That's probably what is causing your hang because the code for fact deletion handles getting rid of that structure, not the garbage collector. Your call to CopyMultifield creates a copy of the multifield created by MBCreate and that copy isn't managed by the garbage collector.