There are two ways that can be used to "write the lower 4 bits of a port"
read the port, mask in your four bits, and write the value back out:
temp = (PORTB & 0xF0); // mask off lower four bits
temp |= myval & 0xF; // add in the new four bits
PORTB = temp; // write back out
write the bits individually. For the application you describe, where you are looping through multiple multiplexer values, you might be able to get clever with which chip-select goes where and use a sort of Gray code that requires a minimum of bit changes between states:
//assume D0:3 = 0 to start with
spi_read_stuff();
PORTB |= 0b0001; // 1 means CS 1
spi_read_stuff();
PORTB |= 0b0010 // 11 means CS 2
spi_read_stuff();
PORTB &= ~0b0001; // 10 means CS 3
// ... etc
byte counter = 0xnn; //value is updated by a loop counter
for(int i = 0; i<4; i++)
{
bitWrite(PORTD, i, bitRead(counter, i)); //lower 4-bit of counter gets written into lower 4-bit of PORTD
}