起こり得ますし、現象だけ見ると「ソースではなくプロジェクト設定の差」で挙動が変わっている可能性が高いです。
理由を説明します。
Cファイルやヘッダが同一でも、Microchipのコンパイラやリンカは以下のような条件で生成されるアセンブラやHEXが変わります。
1つ目はコンパイルオプションや最適化設定の違いです。
同じソースでも、最適化レベル、メモリモデル、スタックやヒープの設定、プリプロセッサ定義(プロジェクトプロパティで定義しているマクロ)などが違うと、生成されるアセンブラはかなり変わります。その結果、微妙なタイミングや未初期化変数の使い方が変わり、片方だけバグになることがあります。
2つ目はリンカ設定の違いです。
PIC18ではリンカスクリプトやメモリマップ、配置するライブラリの有無などが違うと、関数や変数の配置アドレスが変わります。スタックの位置や割り込みベクタ付近の配置が変わると、隠れていた不具合が出たり、逆に出なくなったりします。アセンブラレベルで見ると「いろいろ違う」状態になりますし、チェックサムも当然変わります。
3つ目はコンフィグビットやID領域などの違いです。
CONFIGビット、IDLOC、リセットベクタ周りの設定がプロジェクトごとに微妙に違うと、HEXファイルの一部だけが変化し、それがチェックサムの違いになります。MPLABの設定や別ツールで生成した設定ファイルを読んでいる場合も要注意です。
4つ目はプロジェクト自体の壊れや中間ファイルの残りです。
プロジェクトファイルが一部壊れていたり、古いオブジェクトファイルやライブラリが再利用されていると、ソースを変えていない箇所まで影響が出ます。クリーンビルドで改善することもあります。
今回、機能を移植したソフト③は正常で、ソフト②だけおかしいということは、ソースよりも「ソフト②のプロジェクト設定かビルド環境」に差があると考えるのが自然です。
対処としては
・ソフト①、②、③のプロジェクトプロパティを一つずつ見比べる(コンパイラ、リンカ、コンフィグビット、プリプロセッサ定義、最適化レベル、メモリ設定など)
・一度ソフト③のプロジェクトをコピーして、そこに新機能を入れ直してソフト②相当を作り直す
・クリーンビルドを行い、古い中間ファイルを全削除する
といった手順で原因を絞り込むとよいと思います。