Hello David!
First of all, the where-object is there to give you an option to filter through objects when there isn't a "-Filter" parameter.
the first option is the slowest - you bring all Win32_Product objects, pass them through the pipeline, and then select the ones that their name matches "EndNote"
the 2nd and 3rd option are faster, because filtering occur during the query, the WMI library return the objects that you asked for without you having to filter them with Where-Object.