If you look at the assembly code the compiler produces, you can see it compiles to the exact same thing - when using a constant.:
void setup() {
....
digitalWrite(_S1, (chan & 2)>>1);
282: 84 e0 ldi r24, 0x04 ; 4
284: 0e 94 6b 00 call 0xd6 ; 0xd6 <digitalWrite.constprop.0>
....
digitalWrite(_S1, (bool)(chan & 2));
29a: 84 e0 ldi r24, 0x04 ; 4
29c: 0e 94 6b 00 call 0xd6 ; 0xd6 <digitalWrite.constprop.0>
However, using a variable produces different results:
void loop() {
digitalWrite(_S0, (chan & 1));
2a2: c0 91 00 01 lds r28, 0x0100 ; 0x800100 <__data_start>
2a6: d0 91 01 01 lds r29, 0x0101 ; 0x800101 <__data_start+0x1>
2aa: 6c 2f mov r22, r28
2ac: 61 70 andi r22, 0x01 ; 1
2ae: 83 e0 ldi r24, 0x03 ; 3
2b0: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite(_S1, (chan & 2)>>1);
2b4: 6c 2f mov r22, r28
2b6: 66 95 lsr r22
2b8: 61 70 andi r22, 0x01 ; 1
2ba: 84 e0 ldi r24, 0x04 ; 4
2bc: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite(_S2, (chan & 4)>>2);
2c0: c2 fb bst r28, 2
2c2: 66 27 eor r22, r22
2c4: 60 f9 bld r22, 0
2c6: 85 e0 ldi r24, 0x05 ; 5
2c8: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite(_S3, (chan & 8)>>3);
2cc: c3 fb bst r28, 3
2ce: 66 27 eor r22, r22
2d0: 60 f9 bld r22, 0
2d2: 86 e0 ldi r24, 0x06 ; 6
2d4: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
....
digitalWrite(_S0, (chan & 1));
2a2: c0 91 00 01 lds r28, 0x0100 ; 0x800100 <__data_start>
2a6: d0 91 01 01 lds r29, 0x0101 ; 0x800101 <__data_start+0x1>
2aa: 6c 2f mov r22, r28
2ac: 61 70 andi r22, 0x01 ; 1
2ae: 83 e0 ldi r24, 0x03 ; 3
2b0: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite(_S1, (bool)(chan & 2));
2b4: be 01 movw r22, r28
2b6: 76 95 lsr r23
2b8: 67 95 ror r22
2ba: 61 70 andi r22, 0x01 ; 1
2bc: 84 e0 ldi r24, 0x04 ; 4
2be: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite(_S2, (bool)(chan & 4));
2c2: be 01 movw r22, r28
2c4: 76 95 lsr r23
2c6: 67 95 ror r22
2c8: 76 95 lsr r23
2ca: 67 95 ror r22
2cc: 61 70 andi r22, 0x01 ; 1
2ce: 85 e0 ldi r24, 0x05 ; 5
2d0: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite(_S3, (bool)(chan & 8));
2d4: be 01 movw r22, r28
2d6: 23 e0 ldi r18, 0x03 ; 3
2d8: 76 95 lsr r23
2da: 67 95 ror r22
2dc: 2a 95 dec r18
2de: e1 f7 brne .-8 ; 0x2d8 <main+0xc0>
2e0: 61 70 andi r22, 0x01 ; 1
2e2: 86 e0 ldi r24, 0x06 ; 6
2e4: 0e 94 76 00 call 0xec ; 0xec <digitalWrite>
digitalWrite
calls are the slowest parts in here. It takes about 50 (or more) instruction cycles (if I remember it correctly), so few more or less cycles won't make so big difference.