There is no closed-form solution. Computation must be numerical.
Let $n$ be the length of the vector, set $y_i = \log(x_i)$, and define
$$f(\lambda) = \log\left(\sum_{i=1}^n e^{\lambda y_i}\right)$$
for $\lambda \ge 0$. The problem is to find the (unique positive) zero of $f$. Using the logarithm helps linearize the function near its zero.
The task, then, is to find a value of $\lambda$ close to that zero and then polish it, perhaps using a few Newton-Raphson iterations. These are easy to calculate because computing the derivative of $f$ requires almost no more effort than finding $f$ itself, where the work consists of computing the vector $z=(e^{\lambda y_i})$, for
$$\frac{d}{d\lambda}f(\lambda) = \frac{\sum_{i=1}^n y_i e^{\lambda y_i}}{\sum_{i=1}^n e^{\lambda y_i}} = \frac{y \cdot z}{1 \cdot z}$$
amounts to taking two quick dot products.
A general-purpose approach begins by bracketing the root between $0$ and an upper bound. One upper bound is found by replacing each $y_i$ by the largest of the $y_i$, giving
$$\lambda^{*} = \frac{-\log(n)}{\max(y)}.\tag{1}$$
A bisection search (halve the value of $\lambda^{*}$ until the value of $f$ exceeds $1$) does well even with challenging distributions of the $x_i$. The entire procedure typically requires five to 12 evaluations of $f$ for $n \le 10^6$, requiring much less than a second to complete. Here is an example.

A third of the values of $x$ are close to $1$ while two-thirds are tiny. This causes the bound $(1)$ to grossly overestimate the root. That initial estimate is shown on the right panel, where $\exp(f)$ is plotted on log-log axes: the dotted red line at the right marks its value. Consequently, six bisection steps are needed. They are shown as the regular progression of dotted lines with colors moving through the spectrum from red to yellow, green, and blue. The leftmost line marks the value of $\lambda$ where $f$ is found to exceed $0$. At this point, five Newton-Raphson iterations rapidly converge on the solution, which is computed to double-precision tolerances (in $\lambda$ and $f(\lambda)$). The final value is plotted in purple, exactly where $\exp(f)=1$.
The R
code that produced these plots includes a general-purpose solution.
#
# Generate sample data.
#
n <- 1e6
set.seed(17)
a <- c(-10, -5, -0.5)
b <- c(-5, -3, 0)
x <- exp(runif(n, a, b))
#
# Find lambda.
#
system.time(
{
y <- log(x)
n <- length(x)
#
# Initial bisection search.
#
f <- function(lambda, y) {
z <- exp(lambda * y)
list(f=log(sum(z)), df=crossprod(y, z) / sum(z))
}
lambda <- -log(n) / max(y)
z <- c(lambda, rep(NA, iter.max))
j <- 1
while(f(lambda, y)$f < 0) { #$
lambda <- lambda/2
j <- j+1; z[j] <- lambda
}
#
# Final NR search.
#
tol <- 1e-12
tol2 <- 1e-14
iter.max <- 25
delta <- NA
converged <- -1
for (i in j:iter.max) {
#
# Evaluate the function and compare to zero.
#
converged <- 0
delta.old <- delta
lambda.old <- lambda
w <- f(lambda, y)
if (abs(w$f) < tol2) break
#
# Take a step.
#
converged <- 1
delta <- w$f / w$df # NR
if (delta > lambda) delta <- delta / 2 # Bisection
lambda <- lambda - delta
#
# Store the step and check for progress.
#
z[i+1] <- lambda
if (abs(delta) < tol * abs(lambda)) break
converged <- -1
}
z <- z[1:max(which(!is.na(z)))]
}
)
if (converged < 0) stop("Failed to converge.")
#
# Plot the search.
#
par(mfrow=c(1,2))
hist(y, breaks=100)
x.0 <- seq(min(z, na.rm=TRUE)/1.25, max(z, na.rm=TRUE)*1.25, length.out=101)
z.0 <- sapply(x.0, function(lambda) exp(f(lambda, y)$f))
plot(x.0, z.0, type="l", log="xy", xlab="lambda", ylab="",
main=paste("n =", n),
sub=paste(i, "evaluations"))
abline(h=1, lwd=2, col="Gray")
abline(v=z, lty=3, col=hsv(seq(0, 5/6, length.out=length(z)), 0.8, 0.8))
#
# Display some useful statistics, such as the last NR steps.
#
print(c(d.f=sum(exp(lambda * y)) - 1, d.loglambda=delta/lambda))
#
# The entire search is in `z`. The final value is stored in `lambda`.
#------------------------------------------------------------------------------#