If I understand this correctly, it looks like we only need to do the cool `heights` -> `height` reduction once. I also recommend the following name changes:

- `subtract` -> `occupied`
- `height` -> `available`

You could append `Height` to both of those names, but since the function is named `generateHeightRule`, that's implied.

```javascript
// Memoize the occupied height calculation
occupied = generateHeightRule.occupied;
if (occupied == null) {
  computed = window.getComputedStyle(ThreadUI.recipientsList, null);

  occupied = generateHeightRule.occupied = [
    ThreadUI.INPUT_MARGIN,
    ThreadUI.subheader.scrollHeight,
    ThreadUI.sendButton.scrollHeight,
    parseInt(computed.getPropertyValue('margin-bottom'), 10)
  ].reduce(function(a, b) { return a + b; });
}

available = ThreadUI.container.clientHeight - occupied;

if (available === generateHeightRule.available) {
  return;
}
```

...that calculation and memoization could even be encapsulated into a dedicated `getOccupiedHeight` method.