One alternative is measuring width of prefix texts and passing maximum width to ListItem
val density = LocalDensity.current
val textMeasurer = rememberTextMeasurer()
val prefixWidth by remember(prefix, prefix.size) {
derivedStateOf {
with(density) {
prefix.maxOf { text ->
textMeasurer.measure(text).size.width
}.toDp()
}
}
}

Demo
@Preview
@Composable
private fun TextAlignTest() {
val prefix = listOf("1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.")
val description = listOf(
"First",
"Second",
"Third",
"Fourth",
"Fifth",
"Sixth",
"Seventh",
"Eighth",
"Ninth",
"Tenth"
)
val density = LocalDensity.current
val textMeasurer = rememberTextMeasurer()
val prefixWidth by remember(prefix, prefix.size) {
derivedStateOf {
with(density) {
prefix.maxOf { text ->
textMeasurer.measure(text).size.width
}.toDp()
}
}
}
Column(
modifier = Modifier.padding(16.dp)
) {
prefix.forEachIndexed { index, prefix ->
ListItem(
prefixWidth = prefixWidth,
prefix = prefix,
description = description[index]
)
}
}
}
@Composable
fun ListItem(
prefixWidth: Dp,
prefix: String,
description: String
) {
Row {
Text(modifier = Modifier.width(prefixWidth).border(1.dp, Color.Red), text = prefix)
Spacer(Modifier.width(8.dp))
Text(description)
}
}