> My code works, but the if/else if statements I used feel clunky. This
> is a common feeling I have when I'm writing code.

To improve code readability and reduce the perceived complexity, you need to reduce nesting, remove conditional branches, simplify if-conditions and switch to a more descriptive style. The following 'techniques' help to simplify your code sample:

1. **Exploit the nested loop structure:** The first `if` condition checking for line-breaks becomes `true` whenever the inner loop terminates. Get rid of the condition and move the statement below the inner loop body:
    
        var size = 8;
        var result = '';
        for (var i = 0; i < size; i++) {
          for (var j = 0; j < size; j++) {
            if ((j % 2 === 0 && i % 2 === 0) || (j % 2 === 1 && i % 2 === 1)) {
              result += ' ';
            } else if ((j % 2 === 0 && i % 2 === 1) || (j % 2 === 1 && i % 2 === 0)) {
              result += '#'; 
            }
          }
          result += '\n';
        }
    
1. **Remove the redundant `else if` condition:** The final `else if` condition is redundant as it is always `true` when the first if-condition is `false`. Remove it:
    
        var size = 8;
        var result = '';
        for (var i = 0; i < size; i++) {
          for (var j = 0; j < size; j++) {
            if ((j % 2 === 0 && i % 2 === 0) || (j % 2 === 1 && i % 2 === 1)) {
              result += ' ';
            } else {
              result += '#'; 
            }
          }
          result += '\n';
        }
    
1. **Simplify the `if` condition:** Your `if` condition can be expressed in terms of both loop iterators and thereby simplified to `(j + i) % 2 === 0`:
    
        var size = 8;
        var result = '';
        for (var i = 0; i < size; i++) {
          for (var j = 0; j < size; j++) {
            if ((j + i) % 2 === 0) {
              result += ' ';
            } else {
              result += '#'; 
            }
          }
          result += '\n';
        }
    
1. **Invert the negative `if` condition:** You can get rid of the explicit comparison to zero by switching your `if` and `else` statements:
    
        var size = 8;
        var result = '';
        for (var i = 0; i < size; i++) {
          for (var j = 0; j < size; j++) {
            if ((j + i) % 2) {
              result += '#';
            } else {
              result += ' '; 
            }
          }
          result += '\n';
        }
    
1. **Use the conditional ternary operator for terse conditional assignments:** You can replace the somewhat verbose `if else` statements with a single conditional assignment using the conditional ternary operator:
    
        var size = 8;
        var result = "";
        for (var i = 0; i < size; i++) {
          for (var j = 0; j < size; j++) {
            result += (j + i) % 2 ? '#' : ' ';
          }
          result += '\n';
        }
    
1. **Replace the declarative loop with a more descriptive approach:**
    Exploit built-in methods and introduce new named identifiers for self-documenting code:
    
        function createBoard(size, black = '#', white = ' ') {
          let even = (white + black).repeat(size / 2) + (size % 2 ? white : '') + '\n';
          let odd  = (black + white).repeat(size / 2) + (size % 2 ? black : '') + '\n';
          return     (even  + odd  ).repeat(size / 2) + (size % 2 ? even  : '');
        }
        
        console.log(createBoard(8));

Especially the last two changes are subject to personal preferences - some prefer the declarative style, some stick to `if { ... } else { ... }` everywhere - it's your (team's) choice.