There can be many reasons for this. Here is a probably non-comprehensive list:
E-values depend on database size. Because the E-values depend on the number of sequences in the database but not in the query, a hit may pass the E-value cutoff when BLAST is performed one way but not the other (especially true if the proteomes have vastly different size).
Reporting only top-N hits. Depending on your settings for the search, BLAST will report only the top-N hits for each query sequence. Depending on the number of other, better hits a hit may thus not be shown when searching one way or the other.
Asymmetric repeat masking. Again depending on settings, BLAST may mask repeats in your query sequences but not in the database. Reversing the search thus changes which sequence gets subjected to repeat masking, which can lead to big difference.