Should I include as much information as possbile to help the optimiser? Reading the article "Dynamic Search Conditions in T‑SQL" I saw the following statement in the "Using sp_executesql" section.


  Double Feature
  
  You may wonder why there are two conditions on the order id, customer
  id and product id (lines 32-33, 48-49 and 64-65). This is because I
  once learnt that you should always specify all conditions you know of
  to help the optimizer out. That was very long ago, and the rule may no
  longer apply. But I have included it here nevertheless.


SELECT @sql =                                                      -- 19
    'SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,     -- 20
            c.CustomerID, c.CompanyName, c.Address, c.City,        -- 21
            c.Region,  c.PostalCode, c.Country, c.Phone,           -- 22
            p.ProductID, p.ProductName, p.UnitsInStock,            -- 23
            p.UnitsOnOrder                                         -- 24
     FROM   dbo.Orders o                                           -- 25
     JOIN   dbo.[Order Details] od ON o.OrderID = od.OrderID       -- 26
     JOIN   dbo.Customers c ON o.CustomerID = c.CustomerID         -- 27
     JOIN   dbo.Products p ON p.ProductID = od.ProductID           -- 28
     WHERE  1 = 1'                                                 -- 29
                                                                   -- 30
IF @orderid IS NOT NULL                                            -- 31
   SELECT @sql = @sql + ' AND o.OrderID = @xorderid' +             -- 32
                        ' AND od.OrderID = @xorderid'              -- 33
                                                                   -- 34
--(snip) 
                                                                   -- 46
IF @custid IS NOT NULL                                             -- 47
   SELECT @sql = @sql + ' AND o.CustomerID = @xcustid' +           -- 48
                        ' AND c.CustomerID = @xcustid'             -- 49
                                                                   -- 50
--(snip)    
                                                                   -- 62
IF @prodid IS NOT NULL                                             -- 63
   SELECT @sql = @sql + ' AND od.ProductID = @xprodid' +           -- 64
                        ' AND p.ProductID = @xprodid'              -- 65
                                                                   -- 66


Is that pattern of including the search parameter on both joined tables still correct in modern versions of SQL Server? (Most interested in SQL Server 2008 R2 SP2 and newer)
The best way to determine this is to simply look at the execution plans. Typically the optimizer will "condense" a lot of the operations in a query down. For example, if you include "WHERE 1=0" in your query it will see that, know it to be false, and do as little work as possible to return an empty set. In fact, in this case, it does 0 I/O operations as far as STATISTICS IO is concerned.

Since, by default, the optimizer is going to shuffle your JOINs around into an order that it thinks makes the most sense, I would be very surprised if it didn't also get rid of the redundant conditions in the WHERE clause.

EDIT: This is all assuming the WHERE clause is just going to be repeating what was already established in the JOIN clause. In your example you are including the columns used in the JOIN clause in the WHERE clause, so that equality has already been evaluated once.

I did a quick test on my end and the execution plans were identical, but I still encourage you to give it a try. Also, check out Benjamin Nevarez's book on the optimizer: https://www.red-gate.com/products/sql-development/sql-prompt/entrypage/sql-query-optimizer-ebook

I forgot to mention the amazing tool that is SQL Sentry Plan Explorer: http://www.sqlsentry.com/products/plan-explorer/

Great tool to look at plans, and the free version is VERY capable.