The specifics of the Java case for this (which are probably very similar to the C# case) are to do with how the Java compiler determines if a method is able to return.
Specifically, the rules are that a method with a return type must not be able to complete normally and must instead always complete abruptly (abruptly here indicating via a return statement or an exception) per JLS 8.4.7.
If a method is declared to have a return type, then a compile-time
  error occurs if the body of the method can complete normally.
  In other words, a method with a return type must return only by using
  a return statement that provides a value return; it is not allowed to
  "drop off the end of its body".
The compiler looks to see whether normal termination is possible based on the rules defined in JLS 14.21 Unreachable Statements as it also defines the rules for normal completion.
Notably, the rules for unreachable statements make a special case just for loops that have a defined true constant expression:
A while statement can complete normally iff at least one of the
  following is true:
So if the while statement can complete normally, then a return statement below it is necessary since the code is deemed reachable, and any while loop without a reachable break statement or constant true expression is considered able to complete normally.
These rules mean that your while statement with a constant true expression and  without a break is never considered to complete normally, and so any code below it is never considered to be reachable.  The end of the method is below the loop, and since everything below the loop is unreachable, so is the end of the method, and thus the method cannot possibly complete normally (which is what the complier looks for).
if statements, on the other hand, do not have the special exemption regarding constant expressions that are afforded to loops.
Compare:
// I have a compiler error!
public boolean testReturn()
{
    final boolean condition = true;
    if (condition) return true;
}
With:
// I compile just fine!
public boolean testReturn()
{
    final boolean condition = true;
    while (condition)
    {
        return true;
    }
}
The reason for the distinction is quite interesting, and is due to the desire to allow for conditional compilation flags that do not cause compiler errors (from the JLS):
One might expect the if statement to be handled in the following
  manner:
- An if-then statement can complete normally iff at least one of the
  following is true: - The then-statement is reachable iff the if-then statement is reachable
  and the condition expression is not a constant expression whose value
  is false. 
- An if-then-else statement can complete normally iff the then-statement
  can complete normally or the else-statement can complete normally. - 
- The then-statement is reachable iff the if-then-else statement is
  reachable and the condition expression is not a constant expression
  whose value is false. 
- The else-statement is reachable iff the if-then-else statement is
  reachable and the condition expression is not a constant expression
  whose value is true. 
 
This approach would be consistent with the treatment of other control
  structures. However, in order to allow the if statement to be used
  conveniently for "conditional compilation" purposes, the actual rules
  differ.
As an example, the following statement results in a compile-time
  error:
while (false) { x=3; } because the statement x=3; is not reachable;
  but the superficially similar case:
if (false) { x=3; } does not result in a compile-time error. An
  optimizing compiler may realize that the statement x=3; will never be
  executed and may choose to omit the code for that statement from the
  generated class file, but the statement x=3; is not regarded as
  "unreachable" in the technical sense specified here.
The rationale for this differing treatment is to allow programmers to
  define "flag variables" such as:
static final boolean DEBUG = false; and then write code such as:
if (DEBUG) { x=3; } The idea is that it should be possible to change
  the value of DEBUG from false to true or from true to false and then
  compile the code correctly with no other changes to the program text.
Why does the conditional break statement result in a compiler error? 
As quoted in the loop reachability rules, a while loop can also complete normally if it contains a reachable break statement.  Since the rules for the reachability of an if statement's then clause do not take the condition of the if into consideration at all, such a conditional if statement's then clause is always considered reachable.
If the break is reachable, then the code after the loop is once again also considered reachable.  Since there is no reachable code that results in abrupt termination after the loop, the method is then considered able to complete normally, and so the compiler flags it as an error.