I don't think you can suppress the emails from assignment rules & workflows with Apex.
Email is sent because that's what you have specified in assignment rule (if you don't provide email template, it's not sent - https://na5.salesforce.com/help/doc/en/creating_assignment_rules.htm (replace na5 with your org instance).
But if you'll remove the email template from the rule, I think you still have some options to deal with it :)
You can build a workflow that will send email when criteria is met:
AND( OR( ISNEW(), ISCHANGED(OwnerId)), NOT("your criteria from Apex") )
(you'll need to set "Run this rule if the following: formula evaluates to true" in editor).
- You can build "after insert, after update" trigger (with same logical condition) that would send mail programatically. It's fairly easy & there are many examples.
If the logic you have in "before update" trigger is too complex to be covered with workflow (for example because it spans on several objects & queries) and #1 would be your preferred option, you still can do it. Simply use some custom hidden field in Lead and set it to "true" in your "before update" trigger, then check this value in the workflow.
Of course you could also disable the auto assignment rule completely, tell users that checkbox will be useless from now on and go with full workflow/full triggers solution, but that's a bit too invasive I think.