да, поведение ожидается, но если вы хотите исходное исключение, которое было выбрано с одного из предыдущих этапов, вы можете просто использовать this-
CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException());
future.thenApply(v-> v).exceptionally(e -> {
System.out.println(e.getCause()); // returns a throwable back
return null;
});