rewrite_rules() not applying rules on plugin activation only after permalinks menu is clicked

If I had to guess?

The plugin activation hook is firing before the rewrite_rules_array filter is applied, resulting in the rules being flushed before you make changes to them.

See here for the Codex-recommended implementation, using the wp_loaded action hook.