Should I create an abstract runnable? I've 4 sub-classes which perform similar work but only 3 of them have identical constructors
You have field shutdown that you mutating in a multithreaded code, this field can be cached and might ignore you changing it. You can declare it as volatile to avoid this behavior.

private volatile boolean shutdown;


What makes your abstraction leaky is the fact that BackgroundTask is not abstract enough, that is, Manager and client shouldn't be there.

 public abstract class BackgroundTask implements Runnable {

   abstract void executeTask();
   private boolean shutdown;

   @Override
   public void run() {
    while (!shutdown) {
        executeTask();

        // sleep for msSyncInterval
    }
  }
 }


And now we can have an abstract class that does Task involving clients and managers

 abstract class AbstractManagerClientTask extends BackgroundTask { // not sure about the name
   protected final Manager manager;
   protected final Client client;
   .....
 }


ExchangeData is more specific than a BackgroundTask, it is a AbstractManagerClientTask

  class ExchangeData extends AbstractManagerClientTask{
   ...
  }


It's much easier now, RefreshData can extend BackgroundTask with its own Manager field

 public class RefreshData extends BackgroundTask {
  private final Manager manager;
  ....
 }